为了账号安全,请及时绑定邮箱和手机立即绑定

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

/ 猿问

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

C#
慕田峪7331174 2019-12-25 10:36:35

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


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


using System.Runtime.InteropServices;

但这不是我相信的简单方法。我想要简单的东西。


我有另一个主意(如果存在(文件夹存在),然后复制)某样东西,但是可能有问题,我想要一个好的解决方案。


可能还有一个名为SerialPort的工具。我可以使用吗?如果可以,该如何使用?


查看完整描述

3 回答

?
SMILET

检查可移动设备很容易。但是,不能保证它是USB设备:


var drives = DriveInfo.GetDrives()

    .Where(drive => drive.IsReady && drive.DriveType == DriveType.Removable);

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


该DriveInfo班(MSDN文档)

的DriveType枚举(MSDN文档)


查看完整回答
反对 回复 2019-12-25
?
四季花海

检测是否插入了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/


查看完整回答
反对 回复 2019-12-25
?
PIPIONE

这是一个对我有用的代码,它是上面网站的一部分以及我的早期试用: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;  


查看完整回答
反对 回复 2019-12-25

添加回答

回复

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信