Ich habe ein eigenartiges Problem mit dem Windows-Explorer.
Ich erstelle eine Datei mit FileCreate (bzw. öffne sie mit FileOpen, wenn sie schon existiert), fülle sie mit FileWrite und schließe sie mit FileClose.
Wenn ich dann im Explorer die Datei rechtsklicke (um über Eigenschaften die exakte Größe zu sehen) oder linksklicke, z.b. um sie zu löschen, stürzt der Explorer ab.
Im Programm läuft das so, daß ein Datenpuffer (ca. 16 Mb) gefüllt wird, und dann, wenn seine Kapazität erschöpft ist auf die Platte geschrieben wird. Es ist sichergestellt, daß die Datei unmittelbar vor dem Schreiben geöffnet wird und unmittelbar danach wieder geschlossen wird. Es ist auch sichergestellt, daß während dieser Zeit keine anderen Dateien gelesen oder geschrieben werden oder auch nur geöffnet sind.
Wenn ich das ganze wie unten simuliere, tritt das Problem nicht auf.
Hat jemand eine Idee, was solche Probleme verursachen könnte?
Danke.
Delphi-Quellcode:
PROCEDURE TMain.Test;
const
buffersize=16800000; // ca. 16 Mb und durch 2..8 teilbar
maxfilesize=22000000000; // min High(cardinal)*5 wird benötigt
filename='Test.dat';
type
TData=Array[0..maxint div 8-1] of int64;
TPData=^TData;
var
pdata:TPData;
fh,buffercount:integer;
fsize,freesize,freecount:int64;
dsn:string;
begin
GetMem(pdata,buffersize);
// Hier wird pdata mit Daten gefüllt, die Anzahl der zu sichernden
// Int64 Werte steht dann in buffercount
// Zur Vereinfachung hier auf 2 Mio gesetzt
buffercount:=2000000;
dsn:=ExtractFilePath(paramstr(0))+filename;
if FileExists(dsn) then begin
fh:=FileOpen(dsn,fmOpenWrite);
end else begin
fh:=FileCreate(dsn);
end;
if fh>=0 then begin
fsize:=FileSeek(fh,Int64(0),2); // Dateizeiger ans Ende
freesize:=maxfilesize-fsize;
if freesize>0 then begin
freecount:=freesize div 8;
if buffercount>freecount then buffercount:=freecount;
FileWrite(fh,pdata[0],buffercount*8);
end;
end;
FileClose(fh);
FreeMem(pdata);
end;