하드 드라이브가 USB를 통해 연결되어 있는지 어떻게 감지합니까?

StackOverflow https://stackoverflow.com/questions/220123

  •  03-07-2019
  •  | 
  •  

문제

나는 친구와 가족을위한 작은 백업 프로그램을 작성하려고 노력하고 있으며 가능한 것을 간단하게 사용하기를 원합니다. 나는 사용자에게 데이터를 백업 할 위치를 물어보고 싶지 않으며 컴퓨터에 연결된 첫 번째 USB 하드 드라이브를 검색하고 사용하고 싶습니다. 하드 드라이브의 고유 한 ID를 얻는 것도 다음에 백업이 실행될 때의 이중 점검과 마찬가지로 좋은 생각 일 것입니다.

도움이 되었습니까?

해결책 2

나는 주위를 둘러 보면서 약간의 시간을 보냈고 setupdienumdeviceinfo라는 기능을 찾았습니다.이 기능은 하드 드라이브가 탈착 할 수 있는지 여부를 알 수있는 솔루션을 제공했지만 그 정보를 사용하면 여전히 드라이브 레터에 다시 찾을 수없는 정보를 얻을 수 없습니다!

지금까지 내가 가진 내용은 다음과 같습니다 (다음 코드를 따르는 DLL) :

#include "stdafx.h"
#include <setupapi.h>
#include <devguid.h>
#include <cfgmgr32.h>
extern "C" __declspec(dllexport) int usb_hard_drives() {
  HDEVINFO hdevinfo = SetupDiGetClassDevs(&GUID_DEVCLASS_DISKDRIVE, NULL, NULL, DIGCF_PRESENT);
  if (hdevinfo == INVALID_HANDLE_VALUE) return -1;
  DWORD MemberIndex = 0;
  SP_DEVINFO_DATA sp_devinfo_data;
  ZeroMemory(&sp_devinfo_data, sizeof(sp_devinfo_data));
  sp_devinfo_data.cbSize = sizeof(sp_devinfo_data);
  int c = 0;
  while (SetupDiEnumDeviceInfo(hdevinfo, MemberIndex, &sp_devinfo_data)) {
    DWORD PropertyRegDataType;
    DWORD RequiredSize;
    DWORD PropertyBuffer;
    if (SetupDiGetDeviceRegistryProperty(hdevinfo, &sp_devinfo_data, SPDRP_CAPABILITIES, &PropertyRegDataType, (PBYTE)&PropertyBuffer, sizeof(PropertyBuffer), &RequiredSize)) {
      if (PropertyBuffer && CM_DEVCAP_REMOVABLE == CM_DEVCAP_REMOVABLE) {
        // do something here to identify the drive letter.
        c++;
      }
    }       
    MemberIndex++;
  }
  SetupDiDestroyDeviceInfoList(hdevinfo);
  return c;
}

다른 팁

귀하의 질문이 Win32에 태그된다는 것을 알고 있지만 .NET에서는 매우 간단합니다.

foreach (IO.DriveInfo drive in IO.DriveInfo.GetDrives()) {
  if ((drive.DriveType == IO.DriveType.Removable)) {
    // this is a removable drive
  }
}

레이블을 얻는 것은 drive.name 및 drive.volumelabel을 참조하십시오. 또한 크기를 얻고 USB 스틱 (및 충분히 큰)이라는 교육을받은 추측을 할 수 있습니다. 탈착식은 플로피 또는 USB를 의미 할 수 있습니다. 문서에 따르면.

부수적으로, UI 관점에서 볼 때, 새로운 드라이브를 처음 찾을 때 사용자에게 제시하고 "백업에 사용하려는 드라이브입니까?"라고 묻습니다. 그렇지 않으면, USB 키에서 실수로 데이터를 꽂을 수있는 큰 잠재력이 있습니다. 데이터를 파괴 할 때와 같은 백업 프로그램의 신뢰성을 파괴하지는 않습니다. :)

사용해야합니다 RegisterDevicenotification 기능. 여기 그것을하는 방법에 대한 몇 가지 포인터입니다. 그리고 하나 더 샘플 코드

모든 대량 저장 장치를 사용하여 열거 할 수 있습니다 이것 견본. 일반적으로 setupdixxx API를 찾으십시오.

알림 메커니즘을 사용하여 USB 장치의 동적 특성을 고려하는 것은 필수 IMHO입니다. 방금 도착한 새 장치가 이미 분리되거나 누락 된 자체 분석 장치를 찾을 수 있습니다.

너무 많은 문제없이 몇 가지 정보를 수집 할 수 있습니다.

  • GetDriveType을 사용하여 첫 번째 제거 가능한 드라이브를 찾아 서면이있는 미디어가 존재하는지 테스트하십시오 (CD 드라이브를 크게 배제 할 것입니다). Win32를 통해 드라이브 정보를 쿼리 할 때 사용할 수있는 추가 문자열을 살펴볼 수도 있습니다.
  • Libusb를 사용하여 첫 번째 스토리지 클래스 USB 장치가 어디에 있는지 확인하십시오 (플래시 또는 하드 드라이브 일 것입니다).
  • 이것 C# 기사 활용할 수있는 Win32 디스크 드라이브 클래스를 향한 포인트.

찾을 때 여기에 답을 게시하십시오!

-아담

Win32 API에서 드라이브 유형을 테스트하기위한 훌륭한 기능을 찾았습니다.

if( 2 == ::getDriveType( <driveletter> )){
  // its removable 
}

기능의 반환 값 :

Drive_unkNown 0 : 드라이브 유형을 결정할 수 없습니다.

drive_no_root_dir 1 : 루트 경로는 유효하지 않습니다. 예를 들어, 지정된 경로에는 볼륨이 장착되지 않습니다.

Drive_Removable 2 : 드라이브에는 탈착식 미디어가 있습니다. 예를 들어 플로피 드라이브, 썸 드라이브 또는 플래시 카드 리더.

Drive_Fixed 3 : 드라이브에는 고정 된 매체가 있습니다. 예를 들어, 하드 디스크 드라이브 또는 플래시 드라이브.

Drive_Remote 4 : 드라이브는 원격 (네트워크) 드라이브입니다.

Drive_Cdrom 5 : 드라이브는 CD-ROM 드라이브입니다.

Drive_Ramdisk 6 : 드라이브는 RAM 디스크입니다.

http://msdn.microsoft.com/en-us/library/windows/desktop/aa364939(v=vs.85).aspx

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top