Einzelnen Beitrag anzeigen

DevidEspenschied

Registriert seit: 7. Sep 2006
Ort: Berlin
443 Beiträge
 
Delphi 12 Athens
 
#9

Re: Datei physikalisch lesen/schreiben ohne den Windows-Cach

  Alt 14. Apr 2010, 17:36
Zitat von shmia:
Das wäre extrem aufwändig, da du so das Dateisystem (FAT16, FAT32, NTFS) selbst unterstützen müsstest.
Lösung: einen Stream verwenden.
Man kann aber nicht direkt einen TFileStream verwenden, sondern muss auf THandleStream ausweichen.
Nur so kann man FILE_FLAG_WRITE_THROUGH angeben.
Delphi-Quellcode:
function CreateUnbuffedFilestream(const filename:string):TStream;
var
   fhandle : THandle;
begin
   fhandle := CreateFile(PChar(filename), GENERIC_READ or GENERIC_WRITE,
   0, nil, OPEN_ALWAYS, FILE_ATTRIBUTE_NORMAL or FILE_FLAG_WRITE_THROUGH, 0);

   if hnd <> INVALID_HANDLE_VALUE then
     result := THandleStream.Create(fhandle)
   else
     result := nil;
end;
Hallo shmia,

ich muss nochmal auf Deinen oben genannten Code zurückkommen. Zuerst einmal funktioniert er. Ist es aber möglich, dass das Beschreiben mit FILE_FLAG_WRITE_THROUGH fast 20mal so lange benötigt als ohne? Ich schreibe etwa eine 1 MByte Testdatei auf einen USB-Stick und das braucht fast 2 Minuten mit FILE_FLAG_WRITE_THROUGH, ohne nur wenige Sekunden.

Wenn ich FILE_FLAG_NO_BUFFERING anstatt von FILE_FLAG_WRITE_THROUGH verwende, erhalte ich beim ersten Aufruf von WriteBuffer eine Exception 'Stream-Schreibfehler'.

Es geht mir ja darum, Daten ohne den Windows-Cache zu schreiben. Bei der benötigten Zeit mit FILE_FLAG_WRITE_THROUGH darf ich mir garnicht vorstellen, wie lange eine 100 MByte Datei dauert.
Devid
Devid Espenschied
Pre-sales Consultant
Embarcadero Germany GmbH
germany.info@embarcadero.com

Kein Support per PN
  Mit Zitat antworten Zitat