FindFirst / findNext und Dateiattribut A



  • Hallo zusammen

    Versuche mit FindFirst / FindNext alle JPG dateien in einem bestimmten Verzeichnis in einer Stringlist zu speichern. Funktioniert soweit auch ganz gut. Jedoch wenn dem JPG das Dateiattribut A fehlt wird die Datei nicht gefunden. Hier mal der Quelltext:

    TSearchRec sr;
            if(FindFirst(sPath + "\\*.jpg", 0x02F, sr) == 0)
            {
                    do
                    {
                            if ((sr.Attr & 0x02F) != 0)
                            {
                                    slFiles->Add(sPath + "\\" + sr.Name);
                            }
                    } while (FindNext(sr) == 0);
                    FindClose(sr);
            }
    

    Das Attribut 0x2f bedeutet ja alles auser Verzeichnisse.
    Wenn jedoch das Dateiattribut A fehlt, wird bei sr.Attr 0x80 oder 0x200 angezeigt. Diese Bedeutung kann ich allerdings nicht in der Hilfe finden.
    Hat hierfür irgendjemand eine Erklärung?

    MfG Stephan



  • 1. Warum nimmst du nicht einen der folgenden Ausdrücke aus der Hilfe:

    Konstante       Wert            Beschreibung
    
    faReadOnly      $00000001       Schreibgeschützte Datei
    faHidden        $00000002       Versteckte Datei
    faSysFile       $00000004       Systemdatei
    faVolumeID      $00000008       Laufwerks-ID-Datei
    faDirectory     $00000010       Verzeichnis
    faArchive       $00000020       Archivdatei
    faAnyFile       $0000003F       Beliebige Datei
    

    Und da siehst du auch, dass du nach versteckten Dateien suchst.

    TSearchRec sr;
    if(FindFirst(sPath + "*", faAny, sr) == 0)
    {
     while(FindNext(sr))
     { if(ExtractFileExt(sr.Name)==".jpg") slFiles->Add(sPath + "\\" + sr.Name); }
     FindClose(sr);
    }
    


  • Hallo zusammen

    @rean
    Also mit der Konstante 0x3f hab ich es auch schon ausprobiert und es hat genausowenig funktioniert. Ob ich nun 0x3f oder faAnyFile verwende, macht doch hoffentlich keinen Unterschied.
    Werde ich jedoch auf jeden Fall noch ausprobieren.

    MfG Stephan



  • Warum verwendest Du überhaupt unlesbare Konstanten? Mit 3F kann kein Mensch was anfangen. Mit faAnyFile schon...
    Hast Du es ausprobiert. Mit den Konstanenten hab ich es noch nicht probiert, aber faAnyFile funktioniert einwandfrei.

    Haben vielleicht einige Dateien die Endung JPG? Du prüfst ja nur auf jpg...



  • Dann debug das Teil doch mal.

    Mir sind in meinem Code aber schon ein paar Fehlerquellen aufgefallen.
    1. Habe ich das \\ vor dem Sternchen vergessen.
    2. Um auch Dateien zu überprüfen deren Endung groß geschrieben ist bietet sich AnsiCompareIC an.
    3. faAny gibts garnicht. Muss natürlich faAnyFile heißen
    4. FindNext gibt im Erfolgsfall 0. Also muss es !FindFirst oder FindFirst()==0 heißen.
    Ja man sollte seinen eigenen Text doch mal ausprobieren :p

    Das müsste jetzt aber wirklich funktionieren:

    TSearchRec sr;
    if(FindFirst(sPath + "\\*", faAnyFile, sr) == 0)
    {
     while(FindNext(sr)==0)
     { if(ExtractFileExt(sr.Name).AnsiCompareIC(".jpg")==0) rich->Lines->Add(sPath + "\\" + sr.Name); }
     FindClose(sr);
    }
    


  • Hallo rean

    Die Fehler in deinem Code hab ich mal übersehen, es geht ja ums Prinzip ;-))
    Wenn ich bei FindFirst auf *.jpg prüfen werden auch Dateien mit *.JPG gefunden.
    Ob 3f oder faAnyFile macht keinen Unterschied.
    Allerdings die Verundung der Attribute der gefundenen Datei mit den erwarteten geht immer noch schief.
    Jedoch wenn ich es mir genau überlege, brauch ich dies ja gar nicht. Es sollte dann folgender Code ausreichend sein:

    if(FindFirst(sPath + "\\*.jpg", faAnyFile, sr) == 0)
            {
                    do
                    {
                            slFiles->Add(sPath + "\\" + sr.Name);
                    } while (FindNext(sr) == 0);
                    FindClose(sr);
            }
    

    Bei deiner Schleife fällt mir noch auf, das die erste gefundene Datei nicht in die Liste eingetragen werden müßte. Jedoch nicht ausprobiert.

    Vielen Dank
    MfG Stephan



  • 1. Würde ich trotzdem die defines nehmen wenn sie schon mal da sind 🙄
    Wenn du mal in einem Team programmieren solltest ist sowas völlig inakzeptabel weil deine Kollegen dann erst ewig die Hilfe durchsuchen müssen damit sie wissen was du jetzt genau machen willst. Deshalb lieber gleich einen ordentlichen Stil angewöhnen.
    2. Liefert FindFirst beim Ausführen mit einem Stern grundsätzlich als erstes das Objekt zum angegeben Verzeichnis zurück.
    Heißt also, dass bei meinem Code auch die erste Datei gefunden wird. Macht also keinen großen Unterschied ob man eine kopf- oder fußgesteuerte Schleife verwendet.



  • Hallo rean

    1. Du hast natürlich Recht, jedoch um die 0x2f zu erreichen müßten fast alle Attribute einzeln angegeben werden. da war ich etwas schreibfaul, dies ist jedoch keine Entschuldigung.

    2. Da hast du wohl auch Recht. Denn an das Verzeichniss hab ich gar nicht gedacht. war eben nur eine rein theoretische Überlegung.

    Danke für deine Hilfe.
    MfG Stephan


Anmelden zum Antworten