Pergunta

Eu estou tentando escrever um pequeno programa de backup para amigos e família e quer que ele seja tão simples de usar uma possível. Eu não quero ter que perguntar ao usuário onde fazer backup de seus dados para, eu só quero procurar e usar a primeira unidade de disco rígido USB ligado ao computador. Obtendo a identificação única do disco rígido, provavelmente seria uma boa idéia também, assim como uma verificação dupla para a próxima vez que o backup é executado.

Foi útil?

Solução 2

Eu passei um pouco de tempo olhando ao redor e encontrou uma função chamada SetupDiEnumDeviceInfo que fez fornecer uma solução para saber se um disco rígido foi removível ou não, mas com essa informação ainda não pode (ainda) mapear o que eu acho de volta a um letra da unidade!

Aqui está o que eu tenho até agora (seguinte código cria uma 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;
}

Outras dicas

Eu sei que sua pergunta é marcado Win32, mas isso é bastante simples com .NET:

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

Veja drive.Name e drive.VolumeLabel para obter o rótulo. Você também pode obter o tamanho e fazer um palpite de que é um stick USB (e um grande o suficiente) - removível pode significar tanto disquete ou USB, acordo com os docs .

Como uma nota lateral, de uma perspectiva UI, eu sugiro a primeira vez que você encontrar uma nova unidade, apresentá-lo para o usuário e pedir "é esta a unidade que deseja usar para backups?". Caso contrário, existe um grande potencial para acidentalmente apagando dados em uma chave USB que passou a ser ligado. Nada destrói a credibilidade de um programa de backup como quando ele destrói seus dados. :)

Você precisa usar RegisterDeviceNotification função. Aqui é algumas dicas sobre como para fazê-lo. E um código mais amostra

Você pode enumerar todos os dispositivos de armazenamento em massa usando esta amostra . Em olhar Geral SetupDiXXX API.

Por favor note que absorvam natureza consideração dinâmica de dispositivos USB, usando o mecanismo de notificação é IMHO obrigatório. Você pode encontrar o seu dispositivo de análise auto que já destacada ou faltando novo dispositivo que acabou de chegar.

Algumas peças de informações pode ser obtida sem muita dificuldade:

  • Use GetDriveType para encontrar a primeira unidade removível, teste se existe mídia gravável (que será em grande parte descartar unidades de CD). Pode também querer olhar para outras cadeias que estão disponíveis quando você consulta as informações da unidade via win32.
  • Use libusb para ver onde o primeiro dispositivo de classe USB de armazenamento é (provavelmente será um flash drive ou disco)
  • C # artigo direção win32 aulas de unidade de disco que você pode ser capaz de bater.

Post aqui a sua resposta quando você encontrá-lo!

-Adam

Eu encontrei uma grande função na API Win32 para testar o tipo de unidade.

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

Os valores de retorno de função:

DRIVE_UNKNOWN 0: O tipo de unidade não pode ser determinada.

DRIVE_NO_ROOT_DIR 1: O caminho da raiz é inválido; por exemplo, não há nenhum volume montado no caminho especificado.

DRIVE_REMOVABLE 2: A unidade tem meios amovíveis; por exemplo, uma unidade de disquete, pen drive, ou leitor de cartão de memória flash.

DRIVE_FIXED 3: A unidade tem fixo meios; por exemplo, uma unidade de disco ou flash de disco rígido.

DRIVE_REMOTE 4: A unidade é um (rede) unidade remota.

DRIVE_CDROM 5:. A unidade é uma unidade de CD-ROM

DRIVE_RAMDISK 6:. A unidade é um disco de RAM

http: // MSDN .microsoft.com / en-us / library / janelas / desktop / aa364939 (v = VS.85) .aspx

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top