我正在尝试为朋友和家人编写一个小备份程序,并希望它尽可能简单易用。我不想询问用户将数据备份到哪里,我只想搜索并使用连接到计算机的第一个 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,,-us / library / system.io.drivetype.aspx“rel =”nofollow noreferrer“>。

作为旁注,从UI的角度来看,我建议您第一次找到新驱动器,将其呈现给用户并询问“这是您要用于备份的驱动器吗?”。否则,很有可能会意外地擦除碰巧插入的USB密钥上的数据。没有什么能够破坏备份程序的可信度,就像破坏数据一样。 :)

您需要使用 RegisterDeviceNotification 功能。 这里是关于如何去做吧。还有一个示例代码

您可以使用示例枚举所有大容量存储设备。一般来说,寻找SetupDiXXX api。

请注意,考虑到usb设备的动态特性,使用通知机制是强制性的恕我直言。您可能会发现您的自我分析设备已经分离或丢失刚刚到达的新设备。

可以毫不费力地收集一些信息:

  • 使用 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 /库/窗/桌面/ aa364939(v = vs.85)的.aspx

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top