¿Cómo asegurarse de que un archivo se guardó permanentemente en USB, cuando el usuario no usa "Quitar hardware con seguridad"?

StackOverflow https://stackoverflow.com/questions/1635947

Pregunta

Cuando guardo un archivo en un USB dentro de mi aplicación de Delphi, ¿cómo puedo asegurarme de que el archivo esté realmente (permanentemente) guardado en el USB, cuando "Quitar hardware con seguridad"? no se realiza (especialmente olvidado de usar)?
Diciéndole a nuestro cliente que use la función de Windows "Quitar hardware con seguridad" no funciona.
¿Existe un comando de la API de Windows para vaciar el búfer, de modo que todos los datos se escriban en la unidad USB de forma permanente?

¿Fue útil?

Solución

Aquí hay una función que utilicé para vaciar datos a una unidad USB antes de expulsarla mediante programación. Esta funcionalidad de clones de Mark Russinovich " Sync " utilidad . No he tenido problemas con este código y se ha estado ejecutando en muchos sistemas durante un par de años.

La parte más relevante de este código es la llamada a FlushFileBuffers .

function FlushToDisk(sDriveLetter: string): boolean;
var
  hDrive: THandle;
  S:      string;
  OSFlushed: boolean;
  bResult: boolean;
begin
  bResult := False;
  S := '\\.\' + sDriveLetter + ':';

  //NOTE: this may only work for the SYSTEM user  
  hDrive    := CreateFile(PAnsiChar(S), GENERIC_READ or
    GENERIC_WRITE, FILE_SHARE_READ or FILE_SHARE_WRITE, nil,
    OPEN_EXISTING, 0, 0);
  OSFlushed := FlushFileBuffers(hDrive);

  CloseHandle(hDrive);

  if OSFlushed then
  begin
    bResult := True;
  end;

  Result := bResult;
end;

Otros consejos

Cuando abra el archivo, especifique " escriba a través de " (Marca FILE_FLAG_WRITE_THROUGH en CreateFile ()). Esto obligará al sistema operativo a escribir el archivo directamente. Puede que todavía esté en el caché del sistema operativo para acelerar las lecturas posteriores, pero eso no es un problema para usted.

Si desea vaciar los buffers de archivos, por supuesto siempre hay FlushFileBuffers ()

pase lo que pase, puede desconectar el dispositivo usted mismo, quiero decir programáticamente. entonces estará completamente seguro de que han eliminado el dispositivo correctamente.

eche un vistazo a las respuestas a esta pregunta: safe-remove-usb -drive-using-win32-api . especialmente este enlace a un artículo msdn kb dado en la respuesta.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top