Probleme mit Findfirst und Findnext



  • Wenn ich mit FindFirst einen Ordner auf Dateien durchsuchen lasse und dann die Datei anzeigen lassen will (Die Variable heißt SearchRecord) Zeigt er mir bei der Verwendung von "SearchRecord.Size" Daten an, bei "Searchrecord.Name" jedoch garnix.

    Hier mal der Teil des Programms:

    void __fastcall TForm1::Button2Click(TObject *Sender)
    {
    FindFirst( ExtractFilePath(Application->ExeName), faAnyFile, SearchRecord);
    ListBox1->Items->Add(SearchRecord.Name);
    }
    

    so funktioniert nix. Die ListBox bleibt leer

    void __fastcall TForm1::Button2Click(TObject *Sender)
    {
    FindFirst( ExtractFilePath(Application->ExeName), faAnyFile, SearchRecord);
    ListBox1->Items->Add(IntToString(SearchRecord.Size));
    }
    

    so gehts aber

    Kann mir da jemand weiterhelfen wie ich die Namen anzeigen lasse
    oder was für einen Fehler ich gemacht habe?



  • /edit: Quatsch geschrieben. Sorry.



  • Wo ist SearchRecord definiert / deklariert?



  • Ich vermute einfach das das File nicht gefunden wurde.
    Mach mal folgendes und schau dir den Wert von res an.

    int res = FindFirst( ExtractFilePath(Application->ExeName), faAnyFile, SearchRecord);
    

    Wenn der nicht 0 ist wurde nichts gefunden. Das in size etwas drinsteht bedeutet nicht unbedingt was, da TSearchRec ja nicht mit 0 initialisiert wurde.



  • OK. Das mit dem 0 initialisieren war mein Fehler.
    Aber Durchsucht FindFirst nicht das gesamte Verzeichniss ob eine Datei vorhanden ist?
    hab ja extra anyFile angegeben. Über ExtractPath... greife ich ja auf den Ordner zu indem die .exe liegt.
    darin sind noch viele andere Dateien , aber er zeigt sie nicht an.
    Und das versteh ich eben nicht.

    /edit Die SearchRecord ist am Dateianfang deklariert

    #include "Unit1.h"
    //---------------------------------------------------------------------------
    #pragma package(smart_init)
    #pragma resource "*.dfm"
    TForm1 *Form1;
    TSearchRec SearchRecord;
    


  • ExtractFilePath liefert den Pfad mit finalem Backslash zurück. FindFirst benötigt den Pfad ohne diesen Backslash.

    Edit: natürlich Quark, so wird nur das Verzeichnis gefunden.



  • M.E. reicht

    ExtractFilePath(Application->ExeName)

    auch nicht aus; . sollte noch drangehangen werden



  • So in der Art oder wie meinst du das??

    FindFirst( ExtractFilePath(Application->ExeName + "*.*");
    

    leider geht das auch nicht.

    wie bekomm ich den diese Funktion ohne den Backslash??



  • Wie wärs, wenn du dir den Suchpfad mal ausgeben lässt?
    Natürlich muß am Pfadende (vor dem Suchstring) ein Backslash sein.
    also etwa so

    FindFirst( ExtractFilePath(Application->ExeName) + "*.*");
    


  • Hab grad in nem C++ Tuto noch was gefunden, da brauch FindFirst angeblich \\
    bei jedem weiteren Verzeichnis:

    FindFirst("c:\\Programme\\bcb6\\bin\", faAnyFile, sr);
    😕



  • Hallo

    das ist nicht angeblich so, sondern ein fester Bestandteil des C++ Standards.
    Wenn du also irgendwo im Quellcode in einem String-Literal ein Backslash willst, must es mit einem zweiten Backslash maskieren. Stichwort Escapesequenz.

    Allerdings must du dich bei Strings, die aus Controls oder ähnlichen (wie dem ExeName) herkommen nicht darum kommen, die unterliegen nicht dieser Regel. Das bedeutet das der Code so wie z.B. Braunstein es gepostet hat korrekt ist.
    Du must allerdings daran denken das in den meisten Fällen der erste Treffer für alle Dateien das eigene Verzeichnis ist, sprich ".". Danach kommt ".." für das höhere Verzeichnis. Erst danach kommen die ersten Verzechnisse bzw. Dateien.

    bis bald
    akari



  • Bist Du sicher, dass in Name nichts drinsteht? Oder steht da vielleicht nur ein einzelner Punkt drin. Die erste gefundene Datei, bei faAnyFile, müßte das übergeordnete Verzeichnis sein = '.'.
    Wie machst du das eigentlich mit dem FindClose(), wenn Du ein globales TSearchRec verwendest?



  • In Name stand nix drin. Hab aber jetzt nen Weg gefunden und da funktioniert das auch:

    vFile = "*.*";
    FindFirst( ExtractFilePath(Application->ExeName) + vFile, faAnyFile, SearchRecord);
    

    Danke für eure Hilfe. 🙂



  • Das funktioniert jetzt.
    Der soll *.doc Dateien suchen die geb ich dann mit Pfad an einen OLEContainer weiter.

    Wenn ich den kompletten "automatisch erstellten" Pfad und Dateinamen dort
    nutze kommt ein dicker OLE-Fehler.
    lass ichs mir allerdings den Pfad und so in einem Label ausgeben und schreibe das Genau so hinein gehts. äußerst komisch.



  • Hallo

    läst sich ohne releanten Codeausschnitt nichts zu sagen.
    Jedenfalls verändern sich der Wert eines Strings nicht, wenn er über ein Label weitergegeben wird.

    bis bal
    akari


Anmelden zum Antworten