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.