2008-09-25 19 views
5

Intenté utilizar DriveInfo.IsReady, pero devuelve falso si hay un disquete sin formatear en la unidad.¿Cómo puedo detectar si hay un disquete en una unidad?

+1

¿Qué es un disquete :) – FlySwat

+0

Mi primera respuesta fue: "Mira hacia abajo en el disco". Pero me di cuenta de que probablemente sea inútil. ¿Por qué las unidades de disco ya no? –

+0

Eso tiene sentido, ¿no? Un disco SINORME obviamente no está listo :-) –

Respuesta

3

Siempre puede intentar leer un sector del disquete y ver si tiene éxito o no.

No tengo ni idea de cómo hacerlo en .NET, pero aquí está el equivalente de C/C++.

SetLastError(0); 
HANDLE h = CreateFile("\\\\.\\A:", ...); 
if (!ReadFile(h, buf, 512, &bytes_read, 0)) 
{ 
    DWORD err = GetLastError(); 
} 

CreateFile, ReadFile

1

Simplemente hablando: no se puede. Las unidades de disquetes no son compatibles.

+0

Unidades de disquete DO soporte de descubrimiento de medios, intente guardar desde el Bloc de notas en una unidad vacía o en una unidad con un disco sin formato. Bloc de notas da dos respuestas diferentes. –

+0

Observe que antes de que falle, se enciende la luz de acceso al disco. El Bloc de notas intenta leer un sector en el disco y, si falla, muestra el mensaje "inserte un disco". – OwenP

0

¿qué hay de DriveNotFoundException?

No tengo una disquetera en la computadora en la que estoy actualmente, así que no puedo probarla. Esta excepción se produce cuando el disco no está disponible, que es una condición que creo que se cumpliría cuando el disquete esté vacío.

+0

Hasta ahora no puedo encontrar ningún método .Net que actúe de forma diferente para la caja de disquete y la caja de disquete sin formatear –

0

Tal vez se puede ver en las API de gestión de disco ... Eso debería ser capaz de decir que la capacidad del disco (ya sea el formato o no) ...

Y si no hay capacidad, no hay disquete insertado ...

0

Trampa DiscNotReady (para ningún disco en el disco), y excepciones de escritura (para el sistema de archivos no válido/no formateado).

0

Jonas cosas trabajaron:

bool MyDll::Class1::HasFloppy(wchar_t driveLetter) { 
wchar_t path[] = L"\\\\.\\A:"; 
path[ 4 ] = driveLetter; 

SetLastError(0); 
HANDLE drive = CreateFile(path, //__in  LPCTSTR lpFileName, 
      GENERIC_READ,  //__in  DWORD dwDesiredAccess, 
      0,    //__in  DWORD dwShareMode, 
      0,    //__in_opt LPSECURITY_ATTRIBUTES lpSecurityAttributes, 
      OPEN_EXISTING, //__in  DWORD dwCreationDisposition, 
      0,    //__in  DWORD dwFlagsAndAttributes, 
      0     //__in_opt HANDLE hTemplateFile 
); 

DWORD bytes_read; 
char buf[ 512 ]; 
DWORD err(0); 
if(!ReadFile(drive, buf, 512, &bytes_read, 0)) 
    err = GetLastError(); 

CloseHandle(drive); 
return err != ERROR_NOT_READY; 

}

+0

Dulce :) ¡Feliz hacking! –

+0

Muy bonito, pero en realidad no se parece a .NET como preguntaste .. –

0

Si inserta un disquete sin formato en la unidad de disquete, el propósito sería normalmente a utilizar ese disquetera con ese disquete. El primer paso luego es lógicamente formatear ese disquete.

Por lo tanto, si detecta una unidad de disquete que no está lista, puede tratar de formatear el disco, y si tiene éxito, la unidad de disquete debería estar lista con un disquete recién formateado. Si falla el formato de la unidad de disquete no configurada, no hay un disquete o el disquete está defectuoso. Luego puede mostrar un mensaje para insertar un disquete en la unidad.

Cuestiones relacionadas