Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Algorithmen, Datenstrukturen und Klassendesign (https://www.delphipraxis.net/78-algorithmen-datenstrukturen-und-klassendesign/)
-   -   Problem mit dem Suchen nach Dateien (https://www.delphipraxis.net/176085-problem-mit-dem-suchen-nach-dateien.html)

ByTheTime 11. Aug 2013 18:22

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:
  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;
Die Procedure erfüllt (anscheinend) ihren Zweck und zählt, wenn ich das ganze durch meinen iTunes Ordner laufen lasse, 15325 MP3-Dateien.

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:
  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;
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:

Ich hoffe ihr habt vllt. eine Idee :stupid:

Grüße,
Lukas

zeras 11. Aug 2013 18:27

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.

Furtbichler 11. Aug 2013 18:38

AW: Problem mit dem Suchen nach Dateien
 
Zitat:

Zitat von zeras (Beitrag 1224352)
In jedem Unterpfad wird als Datei "." und ".." gefunden.

Das sind jetzt aber nur 2 Dateien, die zudem die zweite Prozedure finden müsste, aber nicht die erste. Es werden jedoch 13 zusätzliche Dateien gefunden.

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:
   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);
Auf diese Weise kannst Du dir die Frage dann selbst beantworten.

Union 11. Aug 2013 18:51

AW: Problem mit dem Suchen nach Dateien
 
Unterstützt XE2 noch nicht TDirectory.GetFiles mit einem FilterPredicate?

ByTheTime 11. Aug 2013 19:29

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.

DeddyH 11. Aug 2013 19:30

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.

Union 11. Aug 2013 19:37

AW: Problem mit dem Suchen nach Dateien
 
Zitat:

Zitat von ByTheTime (Beitrag 1224357)
Doch, siehe hier. Allerdings bietet mir die oben gezeigte Methode auch den direkten Zugriff auf die Dateigröße, was ebenfalss wichtig ist.

Deshalb erwähnte ich ja das Filterpredicate:

Delphi-Quellcode:
TFilterPredicate = reference to function(const Path: string; const SearchRec : TSearchRec);

ByTheTime 11. Aug 2013 19:58

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:
if ExtractFileExt(SR.Name) = '.mp3' then { ... }
Ist '.mp3' = '.Mp3' ? Nein... Die if-Abfrage ist Case-Sensitive ARGHH! :wall::wall::wall::wall::wall::wall::wall::wall:

@DaddyH: Hab deine Antwort garnicht gesehen, danke :)

musicman56 12. Aug 2013 09:38

AW: Problem mit dem Suchen nach Dateien
 
Zitat:

Zitat von ByTheTime (Beitrag 1224360)
Das Problem hat sich ergeben. Dank diesen netten Funktionen mal beide Ergebnisse verglichen und mir die Unterschiede auflisten lassen.

Nichts gegen diese Funktionen, nur mal so nebenbei: ich habe mich auf "SameText(...)" eingeschossen, weil's in ASM geschrieben ist und sehr schnell. :thumb:


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