USB 드라이브가 연결되어 있는지 확인하는 방법은 무엇입니까?
USB (또는 둘 이상)가 연결되어 있는지 감지하는 프로그램을 만들고 싶습니다 (그리고 모든 내용을 하드 디스크의 폴더에 복사)
어떤 아이디어? 내가 이거 가지고있어,
using System.Runtime.InteropServices;
그러나 그것은 (내가 믿는) 쉬운 방법이 아닙니다. 나는 쉬운 것을 원한다.
다른 아이디어가 있습니다 (폴더가있는 경우 복사).하지만 문제가있을 수 있으며 좋은 해결책을 원합니다.
SerialPort라는 도구도있을 수 있습니다. 나는 그것을 사용할 수 있습니까? 그렇다면 어떻게 사용합니까?
이동식 장치를 쉽게 확인할 수 있습니다. 그러나 USB 장치라는 보장은 없습니다.
var drives = DriveInfo.GetDrives()
.Where(drive => drive.IsReady && drive.DriveType == DriveType.Removable);
현재 액세스 할 수있는 모든 이동식 장치 목록이 반환됩니다. 추가 정보:
DriveInfo
클래스 (MSDN 문서)DriveType
열거 (MSDN 문서)
USB 드라이브가 삽입되었는지 감지하는 것은 간단하지 않습니다. 그러나 그것은 확실히 가능하며 당신을 위해 작업이 완료되었습니다. 다음은 C #에서이 작업을 수행하는 방법에 대한 답변을 각각 자세히 설명하는 두 개의 링크입니다.
http://www.codeproject.com/KB/system/DriveDetector.aspx
http://www.codeproject.com/Messages/2126647/Re-Csharp-USB-Detection.aspx
두 솔루션 모두 잘 작동합니다. 필요에 맞게 조정할 수 있습니다.
편집 : 더 많은 옵션을 원할 경우 세 번째 솔루션이 있습니다 (기본적으로 모두 동일하지만 선택은 좋습니다.) :
다음은 저에게 적합한 코드입니다. 위 웹 사이트의 일부와 초기 평가판이 결합 된 부분입니다. 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
'IT이야기' 카테고리의 다른 글
sqlite (3.6.21) 테이블에서 제약 조건 삭제 (0) | 2021.04.16 |
---|---|
함수 호출로 인해 경고가 발생하는지 확인 (0) | 2021.04.16 |
libgmp-10.dll이 누락되었습니다. (0) | 2021.04.15 |
빈 Seq에 대한 Option [T]의 최소 / 최대? (0) | 2021.04.15 |
첫 번째 열이 문자열이고 나머지 열이 숫자 일 때 numpy.genfromtxt를 사용하는 방법은 무엇입니까? (0) | 2021.04.15 |