Problem mit dem Suchen nach Dateien
Moin,
hier gibt es ein schönes Beispiel, wie man rekursiv nach Dateien suchen kann. Ich benutze diese Procedure in einer Abwandelung, den ich möchte nach mehreren Masken suchen und die Datein nur zähen, nicht auflisten (zumindestens nicht in einer ListBox oder ählichem, ich speichere die DateiInfo in einem Array). Deshalb habe ich erstmal etwas getestet. Der interessante Teil ist das hier:
Delphi-Quellcode:
Die Procedure erfüllt (anscheinend) ihren Zweck und zählt, wenn ich das ganze durch meinen iTunes Ordner laufen lasse, 15325 MP3-Dateien.
if FindFirst(Directory + Mask, faAnyFile and not faDirectory, SR) = 0 then // Mask := '*.mp3';
try repeat { * Datei-Counter um "1" erhöhen * } until FindNext(SR) <> 0; finally FindClose(SR); end; Nun kommt die Modifizierte Funktion. Meine Idee war es, einfach alle Dateien (daher auch keine eindeutige Mask, sondern '*.*') und dann später die DateiEndung zu extrahieren und mit einer Liste zu vergleichen. Dazu wollte ich etwas testen und habe das ganze so umgeschrieben:
Delphi-Quellcode:
Diese Funktion liefert auch etwas zurück, allerdings einen anderen Wert. Sie zählt "nur" 15312 Dateien. :evil: Also 13 Dateien weniger als die "Original Procedure". Ich konnte bis jetzt nicht herausfinden warum. Meine einzige Vermutung war, das vllt. ein Album (kommt mit 13 Dateien ja ziemlich gut hin) einen "Fehler" hat. Also das die Datei z.B. "01 Intro.txt.mp3" heißt und FindFirst die "Richtige Endung" findet, also *.mp3 und ExtractFileExt auf das *.txt kommt und daher diese Datei ausschließt. Allerdings ist das schon ziemlich weit hergeholt... :roll:
if FindFirst(Directory + '*.*', faAnyFile and not faDirectory, SR) = 0 then
try repeat if ExtractFileExt(SR.Name) = '.mp3' then begin { * Datei-Counter um "1" erhöhen * } end; until FindNext(SR) <> 0; finally FindClose(SR); end; Ich hoffe ihr habt vllt. eine Idee :stupid: Grüße, Lukas |
AW: Problem mit dem Suchen nach Dateien
In jedem Unterpfad wird als Datei "." und ".." gefunden. Speichere doch mal alle gefundenen Dateien in einem Memo und da werden diese bestimmt mit auftauchen.
Da war jedenfalls bei mir das Problem. |
AW: Problem mit dem Suchen nach Dateien
Zitat:
Speichere das Ergebnis der ersten Variante in einer TStringList. Anschließend setzt Du 'MyList.Sorted:=True'. Das beschleunigt das suchen im 2.Teil. Im zweiten Teil entfernst Du alle Dateien, die Du gefunden hast, aus der Liste. Übrig bleiben dann die, die die ersten Version findet, die zweite jedoch nicht.
Delphi-Quellcode:
Auf diese Weise kannst Du dir die Frage dann selbst beantworten.
if FindFirst(Directory + '*.*', faAnyFile and not faDirectory, SR) = 0 then
try repeat if ExtractFileExt(SR.Name) = '.mp3' then begin i := MyList.IndexOf(SR.Name); if (i>=0) then MyList.Delete(i) else FehlerMemo.Lines.Add(SR.name+' wird von der 2.Version gefunden, aber nicht von der 1.Version'); end; until FindNext(SR) <> 0; finally FindClose(SR); end; FehlerMemo.Lines.Add('Folgende Dateien werden von der 2.Version nicht gefunden'); FehlerMemo.Lines.AddStrings(MyList); |
AW: Problem mit dem Suchen nach Dateien
Unterstützt XE2 noch nicht TDirectory.GetFiles mit einem FilterPredicate?
|
AW: Problem mit dem Suchen nach Dateien
Doch, siehe hier. Allerdings bietet mir die oben gezeigte Methode auch den direkten Zugriff auf die Dateigröße, was ebenfalss wichtig ist.
|
AW: Problem mit dem Suchen nach Dateien
Haben die nicht gelisteten Dateien evtl. eine andere Endung wie MP3, mP3 oder Mp3? Ich glaube nämlich nicht, dass ExtractFileExt alles in Kleinschreibung wandelt, habe allerdings auch nicht nachgesehen.
|
AW: Problem mit dem Suchen nach Dateien
Zitat:
Delphi-Quellcode:
TFilterPredicate = reference to function(const Path: string; const SearchRec : TSearchRec);
|
AW: Problem mit dem Suchen nach Dateien
Das Problem hat sich ergeben. Dank diesen netten Funktionen mal beide Ergebnisse verglichen und mir die Unterschiede auflisten lassen. Es ist so simpel:
13 Datein tragen die Endung '.Mp3'.
Delphi-Quellcode:
Ist '.mp3' = '.Mp3' ? Nein... Die if-Abfrage ist Case-Sensitive ARGHH! :wall::wall::wall::wall::wall::wall::wall::wall:
if ExtractFileExt(SR.Name) = '.mp3' then { ... }
@DaddyH: Hab deine Antwort garnicht gesehen, danke :) |
AW: Problem mit dem Suchen nach Dateien
Zitat:
|
Alle Zeitangaben in WEZ +1. Es ist jetzt 19:26 Uhr. |
Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz