61

USB(または2つ以上)が接続されているかどうかを検出するプログラムを作成したい(そしてすべてのコンテンツをハードディスク上の任意のフォルダーにコピーしたい)

何か案は?私はこれを持っています、

using System.Runtime.InteropServices;

しかし、それは簡単な方法ではありません(私は信じています)。簡単なものが欲しいです。

私は別のアイデア((フォルダーが存在する場合)をコピーする)を持っていますが、それに問題がある可能性があり、良い解決策が必要です。

SerialPortと呼ばれるツールもあるかもしれません。使えますか?もしそうなら、私はそれをどのように使用しますか?

4

3 に答える 3

69

リムーバブル デバイスのチェックは簡単です。ただし、それが USB デバイスであるという保証はありません。

var drives = DriveInfo.GetDrives()
    .Where(drive => drive.IsReady && drive.DriveType == DriveType.Removable);

これにより、現在アクセス可能なすべてのリムーバブル デバイスのリストが返されます。詳しくは:

于 2011-05-14T18:19:34.907 に答える
13

これが私のために働くコードです、それは私の初期の試験と組み合わされた上記のウェブサイトからの一部です: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;  
于 2012-10-17T11:09:42.543 に答える
2

MicrosoftAPIコードパック。ShellObjectWatcherクラス。

于 2012-02-19T13:21:59.767 に答える