Delphi - 如何获取 USB 可移动硬盘和记忆棒的列表?
在我的应用程序(Delphi)中,我需要列出所有 USB 存储设备。这些可以是闪存棒或外部存储驱动器。
有一个 Jvcl
组件 JvDriveCombo
,它具有 DriveType
属性 - 问题是如果我选择 DriveType := Fix
code> 那么除了外部驱动器之外,它还列出了内部驱动器(C:\
、D:\
等)。但是,我只想列出外部驱动器。
我相信有 DeviceIoControl 函数(我在 MSDN 上看到过),但我不知道如何使用它。
我想知道是否有人可以帮助我使用列出 USB 存储设备的正确方法/代码?
谢谢。
编辑:
我刚刚找到了一些示例代码并将其发布在这里:
uses .... jwawinbase, JwaWinIoctl;
procedure TForm1.Button1Click(Sender: TObject);
var
DriveCmdStr: string;
DriveHandle: THandle;
ADriveLetter: string;
hp: STORAGE_HOTPLUG_INFO;
rlen: DWORD;
begin
ADriveLetter := 'H';
DriveCmdStr := Format('\\.\%s:', [ADriveLetter]);
DriveHandle := CreateFile(PChar(DriveCmdStr), GENERIC_READ, FILE_SHARE_WRITE,
nil, OPEN_EXISTING, 0, 0);
if DriveHandle = INVALID_HANDLE_VALUE then
Exit;
DeviceIoControl(DriveHandle, IOCTL_STORAGE_GET_HOTPLUG_INFO, nil, 0, @hp,
SizeOf(hp), @rlen, nil);
CloseHandle(DriveHandle);
if hp.MediaRemovable then
showmessage('media removable');
end;
现在我只想知道如何枚举所有驱动器号。哪个功能最有效?
In my application (Delphi), I need to list all the USB storage devices. These can be either flash memory sticks or external storage drives.
There is a Jvcl
component JvDriveCombo
, and it has the DriveType
property - the problem is if I select DriveType := Fixed
then in addition to the external drive, it also lists the internal drives (C:\
, D:\
etc). However, I only want to list the external drives.
I believe there is DeviceIoControl function (I saw it on MSDN) but I have no idea of how to use it.
I wonder if anyone can help me with the proper way / code to list USB storage devices?
Thanks.
EDIT:
I just found some sample code and am posting it here:
uses .... jwawinbase, JwaWinIoctl;
procedure TForm1.Button1Click(Sender: TObject);
var
DriveCmdStr: string;
DriveHandle: THandle;
ADriveLetter: string;
hp: STORAGE_HOTPLUG_INFO;
rlen: DWORD;
begin
ADriveLetter := 'H';
DriveCmdStr := Format('\\.\%s:', [ADriveLetter]);
DriveHandle := CreateFile(PChar(DriveCmdStr), GENERIC_READ, FILE_SHARE_WRITE,
nil, OPEN_EXISTING, 0, 0);
if DriveHandle = INVALID_HANDLE_VALUE then
Exit;
DeviceIoControl(DriveHandle, IOCTL_STORAGE_GET_HOTPLUG_INFO, nil, 0, @hp,
SizeOf(hp), @rlen, nil);
CloseHandle(DriveHandle);
if hp.MediaRemovable then
showmessage('media removable');
end;
Now I would like to just know how to enumerate all the drive letters. Which is the most efficient function?
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(3)
您可以使用 WMI 访问此信息。如果您使用此 SQL,您可以访问有关已安装磁盘的信息。
此代码检索有关驱动器的信息。
您必须在使用中添加 ActiveX 和 WbemScripting_TLB(必须导入)。
这样您就可以访问磁盘的所有信息。
要检索所有磁盘的盘符,您可以组合(可以使用相同的代码进行检索)对 Win32_LogicalDiskToPartition 和 Win32_DiskDrive 类的访问。
如果你搜索WMI,你可以找到更多相关代码。
问候。
You can access this information using WMI. If you use this SQL you can access information about installed disks.
This code retrive information about drives.
You must add ActiveX and WbemScripting_TLB (this must be imported) in your uses.
With this you can access all information of the disks.
To retrive the letter of all disk you can combine (retrieve can do with the same code) the access to the classes Win32_LogicalDiskToPartition and Win32_DiskDrive.
If you search WMI you can find more related codes.
Regards.
我不确定您是否只是想枚举驱动器号?下面的 for 循环就是这样做的,遍历所有字母,无论该字母是否有驱动器。
或者,如果您正在寻找一种不同的方式来查找可移动驱动器,下面也有一个功能。 (你的可能会更好...)令人惊讶的是,在我的测试中,Windows.GetDriveType 并不认为 CD 驱动器是可移动的。正如人们所期望的那样,USB 驱动器被标记为可移动。
I'm not sure if you're just looking to enumerate drive letters? The for-loop below does that, going through all letters, regardless of whether there's a drive for that letter.
Or, if you're looking for a different way to find removable drives, there's a function for that below, too. (Yours may be better...) Surprisingly, on my test, Windows.GetDriveType does NOT consider CD drives as removable. USB drives are flagged as removable, as one would expect.