western toshiba saber reparar reconoce pero para herramienta externo esta duro disco dañado como capacidad aparece almacenamiento abre winapi usb hard-drive

winapi - toshiba - ¿Cómo puedo detectar si un disco duro está conectado a través de USB?



mi pc reconoce mi disco duro externo pero no lo abre (5)

Algunas piezas de información se pueden recopilar sin demasiados problemas:

  • Use GetDriveType para encontrar la primera unidad extraíble, pruebe si existen medios grabables (que en gran medida descartarán las unidades de CD). También es posible que desee ver otras cadenas que están disponibles cuando consulta la información de la unidad a través de win32.
  • Use libusb para ver dónde está el primer dispositivo USB de la clase de almacenamiento (probablemente sea un flash o un disco duro)
  • Este artículo de C # apunta hacia las clases de unidades de disco win32 en las que podría obtener acceso.

¡Publica tu respuesta aquí cuando la encuentres!

-Adán

Intento escribir un pequeño programa de respaldo para amigos y familiares y quiero que sea tan simple de usar como sea posible. No quiero tener que preguntar al usuario dónde hacer una copia de seguridad de sus datos, solo quiero buscar y usar el primer disco duro USB conectado a la computadora. Obtener la identificación única del disco duro también sería una buena idea, al igual que un doble control para la próxima vez que se ejecute la copia de seguridad.


Pasé un poco de tiempo mirando a mi alrededor y encontré una función llamada SetupDiEnumDeviceInfo que proporcionaba una solución para saber si un disco rígido era extraíble o no, pero con esa información todavía no puedo (todavía) mapear lo que encontré en una letra de unidad.

Esto es lo que tengo hasta ahora (el siguiente código crea un 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; }


Sé que su pregunta está etiquetada Win32, pero esto es bastante simple con .NET:

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

Consulte drive.Name y drive.VolumeLabel para obtener la etiqueta. También puede obtener el tamaño y adivinar que se trata de una memoria USB (y lo suficientemente grande). Removable puede significar Floppy o USB, según los documentos .

Como nota al margen, desde la perspectiva de la interfaz de usuario, sugiero que la primera vez que encuentre una unidad nueva, la presente al usuario y pregunte "¿esta es la unidad que desea usar para las copias de seguridad?". De lo contrario, existe un gran potencial para borrar accidentalmente los datos en una llave usb que haya sido conectada. Nada destruye la credibilidad de un programa de respaldo como cuando destruye sus datos. :)


Encontré una gran función en la API de Win32 para probar el tipo de unidad.

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

Devuelve los valores de la función:

DRIVE_UNKNOWN 0: el tipo de unidad no se puede determinar.

DRIVE_NO_ROOT_DIR 1: la ruta de acceso raíz no es válida; por ejemplo, no hay ningún volumen montado en la ruta especificada.

DRIVE_REMOVABLE 2: la unidad tiene medios extraíbles; por ejemplo, una unidad de disquete, memoria USB o lector de tarjetas flash.

DRIVE_FIXED 3: la unidad tiene medios fijos; por ejemplo, una unidad de disco duro o unidad flash.

DRIVE_REMOTE 4: la unidad es una unidad remota (red).

DRIVE_CDROM 5: la unidad es una unidad de CD-ROM.

DRIVE_RAMDISK 6: la unidad es un disco RAM.

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


Necesita usar la función RegisterDeviceNotification . Aquí hay algunos consejos sobre cómo hacerlo. Y un código de muestra más

Puede enumerar todos los dispositivos de almacenamiento masivo que utilizan esta muestra. En General, busque las API de SetupDiXXX.

Tenga en cuenta que teniendo en cuenta la naturaleza dinámica de los dispositivos USB, el uso de mecanismos de notificación es IMHO obligatorio. Es posible que encuentre su dispositivo de autoevaluación que ya se haya desconectado o que falte el nuevo dispositivo que acaba de llegar.