如何检测USB驱动器已插入?

ang*_*gel 55 c# file usb-drive

我想构建一个程序来检测是否插入了usb(或两个或更多)(并将所有内容复制到硬盘上的任何文件夹)

有任何想法吗?我有这个,

using System.Runtime.InteropServices;
Run Code Online (Sandbox Code Playgroud)

但这不是简单的方法(我相信).我想要一些简单的事情

我有另一个想法(如果(文件夹存在)然后复制) - 但可能有一个问题,我想要一个很好的解决方案.

可能还有一个名为SerialPort的工具; 我可以用吗?如果是这样,我该如何使用它?

Eli*_*ing 62

可以轻松检查可移动设备.但是,不能保证它是USB设备:

var drives = DriveInfo.GetDrives()
    .Where(drive => drive.IsReady && drive.DriveType == DriveType.Removable);
Run Code Online (Sandbox Code Playgroud)

这将返回当前可访问的所有可移动设备的列表.更多信息:

  • @angel:你不必单独声明`drive`:`drive`是lamba表达式的输入参数,我用它作为`.Where()`扩展方法的输入.它是使用.NET framework 3.5引入的Linq功能的一部分.有关Linq的更多信息:http://msdn.microsoft.com/en-us/vbasic/aa904594. (4认同)

IAm*_*rey 21

检测是否插入了USB驱动器并不简单.但是,这绝对是可能的,并且已经为您完成了工作.以下是两个链接,每个链接都详细说明如何在C#中执行此操作:

http://www.codeproject.com/KB/system/DriveDetector.aspx

http://www.codeproject.com/Messages/2126647/Re-Csharp-USB-Detection.aspx

两种解决方案都应该适合您.您可以根据自己的需要进行调整.

编辑:这是第三个解决方案,如果你想要更多的选项(基本上他们都是相同的,但选择是好的,对吧?):

http://tempuzfugit.wordpress.com/2007/10/08/external-storage-unit-detection-with-c-in-net-usb-card-readers-etc/


小智 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;
    }
Run Code Online (Sandbox Code Playgroud)

别忘了添加这个:

using System.Runtime.InteropServices;
Run Code Online (Sandbox Code Playgroud)

和以下常量:

    const int WM_DEVICECHANGE = 0x0219; //see msdn site
    const int DBT_DEVICEARRIVAL = 0x8000;
    const int DBT_DEVICEREMOVALCOMPLETE = 0x8004;
    const int DBT_DEVTYPVOLUME = 0x00000002;  
Run Code Online (Sandbox Code Playgroud)