Comment détecter si un support est inséré dans un lecteur / lecteur de carte amovible

J’ai un lecteur de carte (aucune clé USB n’est insérée).

Lorsque j’insère dans mon ordinateur, il affiche un lecteur vide dans mon ordinateur …

Est-il possible de savoir si un lecteur dispose d’un média (désolé je ne sais pas comment l’appeler) ou non …

Je trouve la suggestion de MSalters d’utiliser IOCTL_STORAGE_CHECK_VERIFY très bien. Il y a une petite astuce dans l’utilisation de IOCTL_STORAGE_CHECK_VERIFY . Avant d’utiliser le code IOCTL dans la fonction DeviceIoControl il faut ouvrir le périphérique correspondant avec la fonction CreateFile :

 HANDLE hDevice = CreateFile (szDeviceName, // like "\\.\E:" 0, // no access to the drive FILE_SHARE_READ | FILE_SHARE_WRITE, // share mode NULL, OPEN_EXISTING, 0, NULL); 

Pour l’utilisation de DeviceIoControl on peut utiliser 0 comme second paramètre de CreateFile , car nous n’utiliserons pas les fonctions ReadFile , WriteFile etc. pour accéder au périphérique. L’implémentation de IOCTL_STORAGE_CHECK_VERIFY suit certaines lectures de requêtes de données . Donc, pour pouvoir utiliser IOCTL_STORAGE_CHECK_VERIFY sans avoir d’ ERROR_ACCESS_DENIED (5), nous devons ouvrir le périphérique comme suit

 HANDLE hDevice = CreateFile (szDeviceName, // like "\\.\E:" FILE_READ_DATA, // read access to the data FILE_SHARE_READ | FILE_SHARE_WRITE, // share mode NULL, OPEN_EXISTING, 0, NULL); 

Il existe une autre version de IOCTL_STORAGE_CHECK_VERIFYIOCTL_STORAGE_CHECK_VERIFY2 qui fonctionne absolument comme IOCTL_STORAGE_CHECK_VERIFY mais beaucoup plus rapidement (voir http://msdn.microsoft.com/en-us/library/ff560538.aspx ). Pour utiliser IOCTL_STORAGE_CHECK_VERIFY2 il est possible d’ouvrir le périphérique avec uniquement l’access FILE_READ_ATTRIBUTES :

 HANDLE hDevice = CreateFile (szDeviceName, // like "\\.\E:" FILE_READ_ATTRIBUTES, // read access to the atsortingbutes FILE_SHARE_READ | FILE_SHARE_WRITE, // share mode NULL, OPEN_EXISTING, 0, NULL); 

Le code qui teste l’existence du média dans le lecteur peut ressembler à

 DWORD cbBytesReturned; bSuccess = DeviceIoControl (hDevice, // device to be queried IOCTL_STORAGE_CHECK_VERIFY2, NULL, 0, // no input buffer NULL, 0, // no output buffer &cbBytesReturned, // # bytes returned (LPOVERLAPPED) NULL); // synchronous I/O if (bSuccess) _tprintf (TEXT("the device media are accessible\n")); else if (GetLastError() == ERROR_NOT_READY) _tprintf (TEXT("the device media are not accessible\n")); 

La raison de ce comportement est historique et remonte aux lecteurs de disquettes et MS-DOS. Le lecteur A: serait toujours le lecteur A: même s’il n’y avait pas de disquette.

Il est parfois possible de vérifier si un lecteur avec un support amovible est vide. Les lecteurs de cartes et les lecteurs de CD prennent généralement en charge cette fonctionnalité, contrairement aux lecteurs de disquettes. Vous IOCTL_STORAGE_CHECK_VERIFY au lecteur un IOCTL_STORAGE_CHECK_VERIFY .