Comment vous assurer qu'un fichier a été enregistré de manière permanente sur un périphérique USB, lorsque l'utilisateur n'utilise pas & # 8220; Supprimer le périphérique en toute sécurité & # 8221 ;?

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

Question

Lorsque je sauvegarde un fichier sur une clé USB dans l'application Delphi, comment puis-je m'assurer que le fichier est réellement (définitivement) sauvegardé sur la clé USB, lorsque "Retirer le périphérique en toute sécurité"? n'est pas effectué (surtout oublié d'utiliser)?
Dire à notre client d'utiliser la fonctionnalité Windows "Supprimer le périphérique en toute sécurité" ne fonctionne pas.
Existe-t-il une commande API Windows pour vider le tampon afin que toutes les données soient écrites sur le lecteur USB de manière permanente?

Était-ce utile?

La solution

Voici une fonction que j’utilisais pour vider les données sur un lecteur USB avant de les éjecter par programme. Cette fonctionnalité de clonage à partir de Mark Russinovich's & Sync " utilitaire . Je n'ai eu aucun problème avec ce code et il fonctionne sur beaucoup de systèmes depuis quelques années.

La partie la plus pertinente de ce code est l'appel à 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;

Autres conseils

Lorsque vous ouvrez le fichier, spécifiez " écrire à travers " (Indicateur FILE_FLAG_WRITE_THROUGH à CreateFile ()). Cela forcera le système d'exploitation à écrire le fichier directement. Il est peut-être encore dans le cache du système d'exploitation pour accélérer les lectures ultérieures, mais ce n'est pas un problème pour vous.

Si vous souhaitez vider les tampons de fichiers, il existe bien sûr toujours des FlushFileBuffers ()

Quoi qu'il arrive, vous pouvez débrancher l'appareil vous-même, je veux dire par programmation. vous serez alors absolument sûr qu'ils ont correctement supprimé le périphérique.

consultez les réponses à cette question: safe-remove-usb -drive-using-win32-api . en particulier, ce lien vers un article de msdn kb donné dans la réponse.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top