Come assicurarsi che un file sia stato salvato in modo permanente su USB, quando l'utente non utilizza & # 8220; Rimozione sicura dell'hardware & # 8221 ;?

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

Domanda

Quando salvo un file su una USB all'interno della mia applicazione delphi, come posso assicurarmi che il file sia realmente (permanentemente) salvato su USB, quando " Rimozione sicura dell'hardware " non viene eseguito (soprattutto dimenticato di utilizzare)?
Dire ai nostri clienti di utilizzare la funzione di Windows "Rimozione sicura dell'hardware" non funziona.
Esiste un comando API Windows per svuotare il buffer, in modo che tutti i dati vengano scritti in modo permanente sull'unità USB?

È stato utile?

Soluzione

Ecco una funzione che ho usato per scaricare i dati su un'unità USB prima di espellerli a livello di codice. Questa funzionalità clona da Mark Russinovich's & Syn; & Sync " utility . Non ho avuto problemi con questo codice ed è in esecuzione su molti sistemi da un paio di anni.

La parte più rilevante di questo codice è la chiamata 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;

Altri suggerimenti

Quando apri il file, specifica " scrivi attraverso " (Flag FILE_FLAG_WRITE_THROUGH su CreateFile ()). Ciò costringerà il sistema operativo a scrivere direttamente il file. Potrebbe essere ancora nella cache del sistema operativo per velocizzare le letture successive, ma non è un problema per te.

Se vuoi svuotare i buffer di file, c'è ovviamente sempre FlushFileBuffers ()

qualunque cosa accada, puoi scollegare il dispositivo da solo, intendo programmaticamente. allora sarai completamente sicuro che abbiano rimosso correttamente il dispositivo.

dai un'occhiata alle risposte a questa domanda: safe-remove-usb -drive-con-win32-api . in particolare questo link a un articolo di msdn kb fornito nella risposta.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top