Einzelnen Beitrag anzeigen

Amateurprofi

Registriert seit: 17. Nov 2005
Ort: Hamburg
1.041 Beiträge
 
Delphi XE2 Professional
 
#1

Explorer stürzt ab

  Alt 19. Apr 2006, 03:23
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;
Gruß, Klaus
Die Titanic wurde von Profis gebaut,
die Arche Noah von einem Amateur.
... Und dieser Beitrag vom Amateurprofi....
  Mit Zitat antworten Zitat