IT이야기

USB 드라이브가 연결되어 있는지 확인하는 방법

cyworld 2021. 4. 15. 21:58
반응형

USB 드라이브가 연결되어 있는지 확인하는 방법은 무엇입니까?


USB (또는 둘 이상)가 연결되어 있는지 감지하는 프로그램을 만들고 싶습니다 (그리고 모든 내용을 하드 디스크의 폴더에 복사)

어떤 아이디어? 내가 이거 가지고있어,

using System.Runtime.InteropServices;

그러나 그것은 (내가 믿는) 쉬운 방법이 아닙니다. 나는 쉬운 것을 원한다.

다른 아이디어가 있습니다 (폴더가있는 경우 복사).하지만 문제가있을 수 있으며 좋은 해결책을 원합니다.

SerialPort라는 도구도있을 수 있습니다. 나는 그것을 사용할 수 있습니까? 그렇다면 어떻게 사용합니까?


이동식 장치를 쉽게 확인할 수 있습니다. 그러나 USB 장치라는 보장은 없습니다.

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

현재 액세스 할 수있는 모든 이동식 장치 목록이 반환됩니다. 추가 정보:


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/


다음은 저에게 적합한 코드입니다. 위 웹 사이트의 일부와 초기 평가판이 결합 된 부분입니다. http://www.codeproject.com/KB/system/DriveDetector.aspx

이것은 기본적으로 양식이 Windows 메시지를 듣고 USB 드라이브 및 (cd-dvd)에 대한 필터를 듣고 메시지의 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;  

Microsoft API 코드 팩. ShellObjectWatcher 클래스.

참조 URL : https://stackoverflow.com/questions/6003822/how-to-detect-a-usb-drive-has-been-plugged-in

반응형