如何检测驱动器中是否有软盘?
时间:2020-03-06 14:44:36 来源:igfitidea点击:
我尝试使用DriveInfo.IsReady,但是如果驱动器中有未格式化的软盘,它将返回false。
解决方案
简而言之:你不能。软盘驱动器不支持该功能。
DriveNotFoundException怎么办?
我当前使用的计算机上没有软盘驱动器,因此无法对其进行测试。当驱动器不可用时,抛出此异常,这是我认为在软盘驱动器为空时可以满足的条件。
也许我们可以看一下磁盘管理API ...应该可以告诉我们磁盘的容量(无论是否格式化)...
如果没有容量,则没有插入软盘...
既捕获DiscNotReady(对于驱动器中没有磁盘),又写入异常(对于无效的文件系统/未格式化)。
我们总是可以尝试从软盘读取一个扇区,看看它是否成功。
我不知道如何在.NET中执行此操作,但是这是C / C ++等效项。
SetLastError(0); HANDLE h = CreateFile("\\.\A:", ...); if (!ReadFile(h, buf, 512, &bytes_read, 0)) { DWORD err = GetLastError(); }
CreateFile,ReadFile
乔纳斯的作品奏效了:
bool MyDll::Class1::HasFloppy( wchar_t driveLetter ) { wchar_t path[] = L"\\.\A:"; path[ 4 ] = driveLetter; SetLastError( 0 ); HANDLE drive = CreateFile( path, //__in LPCTSTR lpFileName, GENERIC_READ, //__in DWORD dwDesiredAccess, 0, //__in DWORD dwShareMode, 0, //__in_opt LPSECURITY_ATTRIBUTES lpSecurityAttributes, OPEN_EXISTING, //__in DWORD dwCreationDisposition, 0, //__in DWORD dwFlagsAndAttributes, 0 //__in_opt HANDLE hTemplateFile ); DWORD bytes_read; char buf[ 512 ]; DWORD err( 0 ); if( !ReadFile( drive, buf, 512, &bytes_read, 0 ) ) err = GetLastError(); CloseHandle( drive ); return err != ERROR_NOT_READY;
}
如果将未格式化的软盘插入软盘驱动器,则通常目的是将该软盘驱动器与该软盘一起使用。第一步是从逻辑上格式化该软盘。
因此,如果我们检测到未就绪的软盘驱动器,则可以尝试格式化磁盘,如果成功,则软盘驱动器应已准备好,其中包含新格式化的软盘。
如果未就绪的软盘驱动器的格式失败,则说明其中没有软盘,或者其中的软盘有故障。然后,我们可以显示一条消息,将软盘插入驱动器。