Horschdware - Mi 29.03.06 14:07
Titel: Älteste Datei finden... Finde den Fehler nicht
Hallo,
ich versuche gerade mein Programm die älteste Datei in einem Verzeichnis finden zu lassen.
Dazu durchsuche ich zuerste das Verzeichnis und speichere die Dateinamen in eine StringList.
Dann soll die StringList sortiert werden. Dies mache ich per insert sort und nutze die IsNewerThan Funtkion,
die prüft ob FileName1 neuer ist als Nummer 2.
Leider sortiert das nicht richtig.
Ich weiss aber nicht warum.
Habe ich evtl irgendwo einen Denkfehler?
Kann mir jemand weiterhelfen?
Ach ja: Das ganze geht in der Konsole von statten und "AllOptions" ist ein globales record,
in dem in der Variable "FileName" ein Ziel-Datei-name inkl. Pfad gespeichert ist.
edit: Aufgerufen wird im Programmablauf die function "GetOldestFile".
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: 39: 40: 41: 42: 43: 44: 45: 46: 47: 48: 49: 50: 51: 52: 53: 54: 55: 56: 57: 58: 59: 60: 61: 62: 63: 64: 65: 66: 67: 68: 69: 70: 71: 72: 73: 74: 75: 76: 77: 78: 79: 80:
| function IsNewerThan(FileName1 : string; FileName2 : string) : boolean; var FileDate: Integer; DateTime1: TDateTime; DateTime2: TDateTime; iDate1 : int64; iDate2 : int64; begin
if (FileExists(FileName1) AND FileExists(FileName2)) then begin
FileDate := FileAge(FileName1); DateTime1 := FileDateToDateTime(FileDate);
FileDate := FileAge(FileName2); DateTime2 := FileDateToDateTime(FileDate);
iDate1 := StrToInt(FormatDateTime('yyyymmdd',DateTime1)); iDate2 := StrToInt(FormatDateTime('yyyymmdd',DateTime2));
if iDate1 > iDate2 then result:=true else result:=false;
end else result:=false; end;
function GetOldestFile(path : string) : string; var AllFiles : TStringList; rec : TSearchRec; i : integer; temp : string; begin AllFiles:=TStringList.create;
if FindFirst(IncludeTrailingPathDelimiter(ExtractFilePath(Alloptions.Filename))+'*.*',faAnyFile,rec) = 0 then begin AllFiles.Add(rec.Name); while FindNext(rec) = 0 do AllFiles.Add(rec.Name);
FindClose(0); end;
i:=0; while i< AllFiles.Count-1 do begin if IsNewerThan(IncludeTrailingPathDelimiter(ExtractFilePath(Alloptions.Filename))+AllFiles[i], IncludeTrailingPathDelimiter(ExtractFilePath(Alloptions.Filename))+AllFiles[i+1]) then begin temp:=AllFiles[i]; AllFiles[i]:=AllFiles[i+1]; AllFiles[i+1]:=temp; i:=0; end else inc(i); end;
for i:=0 to AllFiles.Count-1 do writeln(AllFiles[i]);
AllFiles.free; end; |
Horschdware - Mi 29.03.06 18:04
Aaaalsoo....
ich hab das ganze nochmal überdacht und mach es jetzt einfach ne runde einfacher.
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: 39: 40: 41: 42: 43: 44: 45: 46: 47: 48: 49: 50: 51: 52: 53: 54: 55: 56: 57: 58: 59: 60: 61: 62: 63: 64: 65: 66: 67: 68: 69: 70: 71: 72: 73: 74: 75: 76: 77: 78: 79: 80: 81: 82: 83:
| function GetFile(path : string; mode : string = 'NEW') : string; function GetFileDate(filename : string) : int64; var DateTime: TDateTime; FileDate: Integer; begin if FileExists(filename) then begin FileDate := FileAge(filename); DateTime := FileDateToDateTime(FileDate); result:=StrToInt(FormatDateTime('yyyymmdd',DateTime)); end else result:=-1; end; var AllFiles : array of FileRec; rec : TSearchRec; i : integer; temp : FileRec; begin setlength(AllFiles,1);
if FindFirst(IncludeTrailingPathDelimiter(ExtractFilePath(Alloptions.Filename))+'*.*',faAnyFile,rec) = 0 then begin AllFiles[high(AllFiles)].FileName:=rec.Name; AllFiles[high(AllFiles)].iDate:=GetFileDate(IncludeTrailingPathDelimiter(ExtractFilePath(Alloptions.Filename))+rec.name);
while FindNext(rec) = 0 do begin setlength(AllFiles,high(AllFiles)+2); AllFiles[high(AllFiles)].FileName:=rec.Name; AllFiles[high(AllFiles)].iDate:=GetFileDate(IncludeTrailingPathDelimiter(ExtractFilePath(Alloptions.Filename))+rec.name); end; FindClose(0); end;
i:=0;
while i < high(AllFiles) do begin if AllFiles[i].iDate > AllFiles[i+1].iDate then begin temp:=AllFiles[i]; AllFiles[i]:=AllFiles[i+1]; AllFiles[i+1]:=temp; i:=0; end else inc(i); end;
i:=0; repeat inc(i); until AllFiles[i].iDate > -1;
if (mode='OLD') then result:=AllFiles[i].FileName else result:=AllFiles[high(AllFiles)].FileName; end; |
Ich sortiere dann einfach das Array durch und gut ists.
@Vera: Du machst bei dir "FindClose(rec)"
lt. Debugger kann ich das nicht, da FindClose den Datentyp Cardinal erwartet.
Irgendwie merkwürdig...
Danke aber mal für deine Lösung.