我想构建一个程序来检测是否插入了usb(或两个或更多) (并将所有内容复制到硬盘上的任何文件夹中)
有什么想法吗?我有这个,
using System.Runtime.InteropServices;
但这不是简单的方法(我相信)。我想要一些简单的事情
我有另一个想法(如果(文件夹存在)然后复制) - 但可能有问题,我想要一个好的解决方案。
可能还有一个名为SerialPort的工具;我可以用吗?如果是这样,我该如何使用它?
答案 0 :(得分:59)
检查可移动设备很容易。但是,不能保证它是USB设备:
var drives = DriveInfo.GetDrives()
.Where(drive => drive.IsReady && drive.DriveType == DriveType.Removable);
这将返回当前可访问的所有可移动设备的列表。更多信息:
DriveInfo
class(msdn文档)DriveType
enumeration(msdn文档)答案 1 :(得分:21)
检测是否插入了USB驱动器并不简单。但是,这绝对是可能的,并且已经为您完成了工作。以下是两个链接,每个链接都详细说明如何在C#中执行此操作:
http://www.codeproject.com/KB/system/DriveDetector.aspx
http://www.codeproject.com/Messages/2126647/Re-Csharp-USB-Detection.aspx
任何一种解决方案都应该适合您。您可以根据自己的需要调整它们。
编辑:这是第三个解决方案,如果您想要更多选项(基本上它们都是相同的,但选择是好的,对吧?):
答案 2 :(得分:11)
这是一个适合我的代码,它是上述网站的一部分,结合了我的早期试验: http://www.codeproject.com/KB/system/DriveDetector.aspx
这基本上使你的表单监听windows消息,usb驱动器和(cd-dvds)的过滤器,抓取消息的lparam结构并提取驱动器号。
protected override void WndProc(ref Message m)
{
if (m.Msg == WM_DEVICECHANGE)
{
DEV_BROADCAST_VOLUME vol = (DEV_BROADCAST_VOLUME)Marshal.PtrToStructure(m.LParam, typeof(DEV_BROADCAST_VOLUME));
if ((m.WParam.ToInt32() == DBT_DEVICEARRIVAL) && (vol.dbcv_devicetype == DBT_DEVTYPVOLUME) )
{
MessageBox.Show(DriveMaskToLetter(vol.dbcv_unitmask).ToString());
}
if ((m.WParam.ToInt32() == DBT_DEVICEREMOVALCOMPLETE) && (vol.dbcv_devicetype == DBT_DEVTYPVOLUME))
{
MessageBox.Show("usb out");
}
}
base.WndProc(ref m);
}
[StructLayout(LayoutKind.Sequential)] //Same layout in mem
public struct DEV_BROADCAST_VOLUME
{
public int dbcv_size;
public int dbcv_devicetype;
public int dbcv_reserved;
public int dbcv_unitmask;
}
private static char DriveMaskToLetter(int mask)
{
char letter;
string drives = "ABCDEFGHIJKLMNOPQRSTUVWXYZ"; //1 = A, 2 = B, 3 = C
int cnt = 0;
int pom = mask / 2;
while (pom != 0) // while there is any bit set in the mask shift it right
{
pom = pom / 2;
cnt++;
}
if (cnt < drives.Length)
letter = drives[cnt];
else
letter = '?';
return letter;
}
不要忘记添加:
using System.Runtime.InteropServices;
和以下常量:
const int WM_DEVICECHANGE = 0x0219; //see msdn site
const int DBT_DEVICEARRIVAL = 0x8000;
const int DBT_DEVICEREMOVALCOMPLETE = 0x8004;
const int DBT_DEVTYPVOLUME = 0x00000002;
答案 3 :(得分:2)
Microsoft API代码包。 ShellObjectWatcher类。