我想在c#中获取可移动磁盘列表.我想跳过本地驱动器.因为我希望用户只将文件保存在可移动磁盘中.
你知道什么是API,或者是用来完成"弹出"功能的API调用序列,它可以在可移动卷的shell上下文菜单中找到?
到目前为止,我尝试了两件事:
使用CM_Request_Device_Eject,我列举(使用的可移动磁盘SetupDiXXX的API),找到一个我感兴趣的,走路设备管理体系(使用CM_XXX的API),并最后调用CM_Request_Device_Eject的devInst我在interesed的设备.这工作在某种意义上说,它删除我的电脑的体积并让设备"安全删除"(准备移除),但它是不一样的外壳上下文菜单中选择"弹出"功能.我知道这个的方式是因为我试图弹出的设备应该在弹出时执行某些操作,并且当我使用弹出时不会发生某些事情CM_Request_Device_Eject.
将DeviceIoControl与IOCTL_STORAGE_EJECT_MEDIA控制代码一起使用.事件的顺序是:
这根本不起作用.每个DeviceIoControl调用都失败ERROR_IVALID_FUNCTION(0x00000001).我不知道为什么呼叫失败了.我已经验证了对DeviceIoControl的其他调用对于相同的文件句柄工作正常(例如IOCTL_STORAGE_GET_DEVICE_NUMBER)
最后,我的开发机器运行的是Windows 7 x64,为了让第二种方法起作用,我尝试使用管理员权限运行我的应用程序并且没有改变任何东西.
编辑
最后,我发现我在方法#2中犯了一个错误.事实证明,由于某种原因,我在使用打开音量控制柄时没有正确设置所需的访问权限CreateFile.正确的访问模式是GENERIC_READ | GENERIC_WRITE,我正在通过0.纠正我的错误后,我能够成功弹出设备使用DeviceIoControl - IOCTL_STORAGE_EJECT_MEDIA与方法#1,以及使用CM_Request_Device_Eject.
事实证明,方法#2确实是shell上下文菜单的"弹出"功能所使用的方法.使用此方法,设备可以正确反应.
如何在Linux中获取可移动驱动器列表(插入USB)?我可以使用KDE,GNOME或其他DE库,如果它可以使事情变得更容易.
我需要检测新驱动器何时通过USB端口,火线端口等插入Windows系统.我知道WM_DEVICECHANGE消息,但这需要打开一个窗口才能使用它.有没有办法在C#中创建后台进程来检测插入新驱动器的时间?
背景信息:我想编写此应用程序以从公司可移动驱动器中删除蠕虫.常规防病毒软件无法删除它.我们有一个将删除蠕虫的脚本,但它必须手动运行,这不足以控制爆发.
如何检测可移动磁盘驱动器何时(dis)连接到系统?如何获取挂载路径(对于Linux)和驱动器号(对于Windows)?
编辑:有没有办法检测当前连接的设备?
在我之前的问题"如何找到闪存设备的唯一序列号?" 我最终要求找到驱动器号的方法.那个问题解决了.
但是,我的初步问题尚未得到解答.我希望能够将可移动设备(USB驱动器,SD卡,(外部硬盘驱动器?)等)分开,并且在重新连接时始终能够再次识别它们.这也应该可以在任何其他计算机上使用.幸运的是,我不关心正在格式化的驱动器(如果/何时,它们在我的程序中被视为新驱动器),那么我可以使用分区和卷ID作为我识别的一部分吗?我问这是因为PNPDeviceID 不是唯一的.我发现它取决于阅读它的硬件,见下图:
替代文字http://i48.tinypic.com/28uofmc.png
替代文字http://i46.tinypic.com/rk5tv6.jpg
因此,我正在搜索的是一种使用以下方法检测和识别任何计算机上的任何可移动设备的方法:Win32_DiskDrive,Win32_DiskPartition,Win32_LogicalDisk.我要感谢RRUZ的原始代码:
program GetWMI_USBConnectedInfo;
{$APPTYPE CONSOLE}
uses
Windows,
Classes,
ActiveX,
Variants,
SysUtils,
WbemScripting_TLB in '..\..\Documents\RAD Studio\5.0\Imports\WbemScripting_TLB.pas';
procedure GetUSBDiskDriveInfo;
var
WMIServices : ISWbemServices;
Root,a,b : ISWbemObjectSet;
Item,Item2 : Variant;
i,ii,iii,iiii: Integer;
start,stop,freq:Int64;
begin
QueryPerformanceFrequency(freq);
QueryPerformanceCounter(start);
WMIServices := CoSWbemLocator.Create.ConnectServer('.', 'root\cimv2','', '', '', '', 0, nil);
Root := WMIServices.ExecQuery('Select * From Win32_DiskDrive','WQL', 0, nil);
for i := 0 to Root.Count - 1 do
begin
Item := Root.ItemIndex(i);
for ii …Run Code Online (Sandbox Code Playgroud) 我正在使用WM_DEVICECHANGE在新的USB驱动器连接到计算机时收到通知.这对于像拇指驱动器这样的设备非常有用,只要设备到达它就可以从中读取文件了.对于像SD卡读卡器这样的设备,它不会,因为当设备连接时,消息会被发送一次,但当用户实际将卡插入设备时,不会发送消息.
是否可以在不使用轮询的情况下检测新媒体插入现有USB设备?
我正在使用Environment.GetLogicalDrives(); 获取驱动器列表.我记得在c ++我可以使用GetDriveType来查找设备是否是CD,可移动,闪存等,我想我想在我的应用程序中放置一个过滤器,只显示CD和默认情况下可移动.C#中的GetDriveType等价物是什么?谷歌只显示我使用c ++调用hacks.
我希望我的应用程序从可移动存储设备运行,它应该从它运行的可移动存储的路径或启动应用程序的rem存储设备.我已经看到nsworkspace获取可移动存储设备的路径,但不知道如何在运行时获取路径.
请建议一种方法来做到这一点.我也在网上搜索并发现mac系统上没有自动运行功能.每当可移动存储连接到mac系统时,我希望我的应用程序自动启动.这有什么解决方法吗?
谢谢
我正在开发一个应用程序,它可以检测卸载存储器或从USB强行拔出可移动存储器时发生的事件.我怎样才能收到这些活动?
我已经看到NSWorkspace了第一种顺利卸载设备的可能性,但是这个类有-unmountAndEjectDeviceAtPath:卸载设备的方法.有人能指出一些检测未安装卷的示例代码吗?
我需要在我的程序中实现搜索SD卡.
目前我正在使用搜索所有可移动设备,例如:
searcher = New Management.ManagementObjectSearcher("\\localhost\root\cimv2", "SELECT DeviceId FROM Win32_LogicalDisk WHERE DriveType=2 AND Size>0");
Run Code Online (Sandbox Code Playgroud)
但它也发现了USB闪存驱动器.有没有找到SD卡的正确方法?我需要的是一般只有可用SD卡的驱动器号(如"F:"左右).
我有一个我格式化的闪存驱动器,以便驱动器上的卷标是"PHILIP".

我Get-PSDrive H -PSProvider FileSystem用来确定是否插入了驱动器,但是我真的想确定驱动器是否被卷标插入,即Get-PSDrive -VolumeLabel PHILIP -PSProvider FileSystem.当然VolumeLabel参数不存在所以这不起作用.
有没有办法按卷名列出计算机中的驱动器?
removable-drive ×12
c# ×4
usb ×3
c++ ×2
cocoa ×2
winapi ×2
.net ×1
antivirus ×1
c ×1
delphi ×1
delphi-2007 ×1
detect ×1
drive ×1
driveinfo ×1
getdrivetype ×1
linux ×1
nsworkspace ×1
powershell ×1
python ×1
removable ×1
usb-drive ×1
volume ×1
wmi ×1