Entwickler-Ecke
Algorithmen, Optimierung und Assembler - FindFirst/FindNext-Suche nach Dateien ohne Erweiterung? Wie?
galagher - Di 08.02.05 21:30
Titel: FindFirst/FindNext-Suche nach Dateien ohne Erweiterung? Wie?
Hallo Leute!
Ich hab meinen File-Finder praktisch fertig, allerdings merke ich gerade, dass er keine Dateien findet, die keine Dateinamenerweiterung haben. Hier mal der Code:
Delphi-Quelltext
1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11: 12: 13: 14: 15: 16: 17: 18:
| var Attr, k: Integer; Search: TSearchRec; D, FSize: String; F: Cardinal; begin Attr := faArchive + faReadOnly + faHidden + faSysFile;
Path := IncludeTrailingBackSlash(Path);
with TStringList.Create do try CommaText := Mask; for k := 0 to Count - 1 do if FindFirst(Path + Strings[k], Attr, Search) = 0 then repeat |
Ich habe zu Testzwecken eine Datei ABC erstellt - wird weder mit ??? noch mit * noch mit abc gefunden. Wie kann ich FindFirst/FindNext dazu bringen, auch solche Dateien zu finden?
AXMD - Di 08.02.05 21:38
Das liegt an Windows; hatte das Problem auch mal. FindFirst/Next findet keine Dateien, die keine Endung haben
AXMD
Sprint - Di 08.02.05 21:42
Ich kann deinen Fehler nicht reproduzieren (Delphi 5). Weder unter Windows 95 mit FAT16 noch unter Windows XP mit NTFS.
Welche Delphi und welche Windows Version nutzt du? Und zeige mal einen vollständiges Beispiel wo es nicht mit geht.
galagher - Di 08.02.05 22:09
Sprint hat folgendes geschrieben: |
Welche Delphi und welche Windows Version nutzt du? Und zeige mal einen vollständiges Beispiel wo es nicht mit geht. |
Delphi 6, WinMe. Wenn ich zum Testen
Delphi-Quelltext
1:
| if FindFirst(Path + '???', Attr, Search) = 0 then Caption := Search.Name; |
angebe, funktioniert es - Caption ist nun der Dateiname ABC.
Naja, hier mal die ganze Prozedur. Sie stammt nicht zur Gänze von mir (hab's aber verabsäumt, zu notieren, von wem :oops: ):
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:
| procedure TForm1.FindFile(Path, Mask: String); var Attr, k: Integer; Search: TSearchRec; D, FSize: String; F: Cardinal; begin Attr := faArchive + faReadOnly + faHidden + faSysFile;
Path := IncludeTrailingBackSlash(Path);
with TStringList.Create do try CommaText := Mask;
for k := 0 to Count - 1 do if FindFirst(Path + Strings[k], Attr, Search) = 0 then repeat Application.ProcessMessages; if (Application.Tag = -2) or (Found = -1) then break;
Label1.Caption := Path+Search.Name; Label1.Refresh;
D := GetFileDate(Path+Search.Name); F := Search.Size;
if (StrToDate(D) < VorFDate) and (StrToDate(D) > NachFDate) and (F < MinFSize) and (F >= MaxFSize) then if Is_LabeledEdit2Text_InFile(Path+Search.Name) then if not (AnsiLowerCase(ExtractFileExt(Search.Name)) = Ext) then begin Inc(FileCount); if FileCount > 1 then StringGrid1.RowCount := StringGrid1.RowCount+1; StringGrid1.Cells[0,FileCount] := Search.Name; StringGrid1.Cells[1,FileCount] := Path;
FSize := SysUtils.FormatFloat('#,#', F); if FSize = '' then FSize := '0'; while Length(FSize) < 12 do FSize := ' '+FSize; StringGrid1.Cells[2, FileCount] := FSize; StringGrid1.Cells[3, FileCount] := GetFileTime(Path+Search.Name)+' '+D; StringGrid1.Cells[4,FileCount] := FGetFileAttr(Path+Search.Name); if CheckBox2.Checked then if not (LabeledEdit2.Text = '') then StringGrid1.Cells[5,FileCount] := IntToStr(Found); Label3.Caption := IntToStr(FileCount-1)+' Datei(en)'; Label3.Refresh; end;
until FindNext(Search) <> 0;
SysUtils.FindClose(Search);
finally Free end;
if not RadioButton3.Checked then if FindFirst(Path + '*.*', faDirectory+faSysFile+faHidden, Search) = 0 then begin repeat
if ((Search.Attr and faDirectory) = faDirectory) and (Search.Name[1] <> '.') then FindFile(Path + Search.Name, Mask); until FindNext(Search) <> 0;
SysUtils.FindClose(Search); end; end; |
Sprint - Di 08.02.05 22:21
Ich meinte eigentlich ein Beispiel und nicht deine ganze Funktion. Obwohl da wohl der Fehler liegen wird.
galagher - Di 08.02.05 22:35
Sprint hat folgendes geschrieben: |
Ich meinte eigentlich ein Beispiel und nicht deine ganze Funktion. Obwohl da wohl der Fehler liegen wird. |
Na ja, wenn der gesuchte Dateityp * ist oder ? oder ??? oder . oder ... dann geht's nicht. :? *.* geht, *nit*.pas geht, ebenso ?????.dc*, eben alles mit Dateinamenerweiterung.
Ich habe ein LabeledEdit für die Suchmaske, wobei auch mehrere eingegeben werden können. Nur eben Dateien ohne Erweiterung findet mein Prog nicht, egal, was ich eingebe.
galagher - Di 08.02.05 22:43
Bin dem Fehler auf der Spur, so wie's aussieht! Muss mir nur noch was einfallen lassen, wie ich's hinkriege! Danke erstmal!
@Sprint: Der Fehler liegt da drin!
Ok, hier korrekt...
Delphi-Quelltext
1: 2: 3: 4:
| if Is_LabeledEdit2Text_InFile(Path+Search.Name) then if not (AnsiLowerCase(ExtractFileExt(Search.Name)) = Ext) or (AnsiLowerCase(ExtractFileExt(Search.Name)) = '') then |
...statt wie ursprünglich
Delphi-Quelltext
1: 2: 3:
| if Is_LabeledEdit2Text_InFile(Path+Search.Name) then if not (AnsiLowerCase(ExtractFileExt(Search.Name)) = Ext) then |
Sorry, dass ich euch wegen sowas Banalem aufgehalten habe! Aber jetzt funktioniert es! :lol:
Sprint - Di 08.02.05 23:01
galagher hat folgendes geschrieben: |
@Sprint: Der Fehler liegt da drin! |
Tja, war irgendwie klar das der Fehler in deiner Funktion liegt und nicht an FindFirst & Co. :)
galagher - Mi 09.02.05 18:17
Sprint hat folgendes geschrieben: |
Tja, war irgendwie klar das der Fehler in deiner Funktion liegt und nicht an FindFirst & Co. :) |
:schmoll:
Sprint - Mi 09.02.05 22:53
galagher hat folgendes geschrieben: |
:schmoll: |
Das war nicht böse gemeint. :wink:
galagher - Do 10.02.05 19:53
Sprint hat folgendes geschrieben: |
Das war nicht böse gemeint. :wink: |
War auch nur ein Scherz! Danke jedenfalls!
Entwickler-Ecke.de based on phpBB
Copyright 2002 - 2011 by Tino Teuber, Copyright 2011 - 2025 by Christian Stelzmann Alle Rechte vorbehalten.
Alle Beiträge stammen von dritten Personen und dürfen geltendes Recht nicht verletzen.
Entwickler-Ecke und die zugehörigen Webseiten distanzieren sich ausdrücklich von Fremdinhalten jeglicher Art!