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 DateiUnd 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 :pDas 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