Autor Beitrag
rstaeker
ontopic starontopic starontopic starontopic starontopic starontopic starofftopic starofftopic star
Beiträge: 94

WIN 2000
D6 Prof
BeitragVerfasst: Sa 30.10.04 20:11 
Hallo,
diesmal eine Frage, die nichts mit dem Job zu tun hat, sondern der privaten Programmierung dient.

Ich setze seit einiger Zeit ein selbst geschriebenes Programm ein, daß mir Dateien aus einem zentralen Download-Verzeichnis in bestimmten Zeitintervallen in andere Verzeichnisse kopiert oder verschiebt. (mittels copyfile)

Manchmal habe ich das Problem, daß beim Öffnen der Kopierten Dateien ein Dateifehler angezeigt wird. Also die Dateien nicht geöffnet werden können. Sie sind offensichtlich beschädigt. Es sind meist große Dateien.

Kann das daran liegen, daß die Datei, die kopiert werden soll, gerade noch geschrieben wird??? Also eine Überschneidung??!!
Das wäre zwar wahrscheinlich ein komischer Zufall (Sekunden als Zeitspanne??), aber vielleicht!!

Kann ich irgendwie überprüfen, ob eine Datei gerade geschrieben wird bevor ich sie Kopiere?? CRC bzw. Checksumme vor und nach kopieren ist doch eher sinnlos oder?

MfG aus Nürnberg :)
Rene
Karlson
ontopic starontopic starontopic starontopic starontopic starofftopic starofftopic starofftopic star
Beiträge: 2088



BeitragVerfasst: Sa 30.10.04 20:30 
Wie wärs damit:

ausblenden volle Höhe Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
18:
19:
20:
21:
22:
23:
24:
25:
26:
27:
28:
29:
30:
31:
32:
33:
34:
35:
36:
37:
38:
function Get_File_Size2(sFileToExamine: string; bInKBytes: Boolean): string;  ///Funktion aus em Swiss delphicenter um die Dat.//grösse zu bestimmen, ohne die Datei öffnen zu müssen.
var
  SearchRec: TSearchRec;
  sgPath: string;
  inRetval, I1: Integer;
begin
  sgPath := ExpandFileName(sFileToExamine);
  try
    inRetval := FindFirst(ExpandFileName(sFileToExamine), faAnyFile, SearchRec);
    if inRetval = 0 then
      I1 := SearchRec.Size
    else
      I1 := -1;
  finally
    SysUtils.FindClose(SearchRec);
  end;
  Result := IntToStr(I1);
end;


function Dateiokay(datei: string):boolean;
var i : integer;
begin
 i := strtoint(get_file_size2(datei, true));
 try
  begin
    sleep(1000);
    application.ProcessMessages;
  end;
   finally
     if i = strtoint(get_File_Size2(datei, true)) then
      begin
       result := true;
      end
       else
        result := false;
       end;
      end;


Dann kannst du bequem mit
ausblenden Delphi-Quelltext
1:
 if dateiokay(DeineDatei) then copyfile(deinedatei, dorthin);					


die Sache regeln.


Gibt btw. bestimmt ne bessere Methode, aber so müsste es schonmal klappen. (Zumindest wenn die Datei gerade noch heruntergeladen wird)