Entwickler-Ecke
Dateizugriff - Problem mit FindFirst unter XPpro
Voxe - Di 20.12.11 18:32
Titel: Problem mit FindFirst unter XPpro
Hallo zusammen,
mein Ziel, alle Dateinamen eines definierten Verzeichnisses in einem string-array zu speichern.
Delphi-Quelltext
1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11: 12: 13: 14: 15:
| var SR: TSearchRec; idx : integer; myPfad : string; Datei : array of string; begin idx := 0; if FindFirst(myPfad+'*.txt', faAnyFile - faDirectory, SR) = 0 then try repeat idx := idx+1; SetLength(Datei,idx+1); Datei[idx] := SR.Name; until FindNext(SR) <> = 0; finally FindClose(SR); end; end; |
Dieser Code bewirkt doch es werden alle Einträge des Verzeichnisses "myPfad" mit der Endung .TXT in das Feld "Datei" geschrieben. Desweiteren werden Unterverzeichnisse ignoriert.
So, nun mein Problem. Es kam vor das manche Datein nicht erkannt wurden. Mit dem Windows-Explorer waren die Dateien sichtbar. Es war nur das Attribut "Archiv" gesetzt. Ich erwähne es mal, obwohl, die Attribute bis hier doch egal sind, oder?
Nachdem ich die Dateien in ein anderes Verzeichniss und zurück kopiert habe (mit dem Windows-Explorer), konnte der oben genannte Code sie wieder erkennen.
Kennt jemand dieses Problem bzw. kann mir helfen wie man das vermeiden kann oder was ich falsch mache ???
Gruß, Voxe
Nersgatt - Di 20.12.11 18:44
Wo wird "myPfad" denn ein Wert zugewiesen? :lupe:
Voxe - Di 20.12.11 19:01
Hallo und Sorry,
habe nur ein Auszug des Codes geschrieben.
myPfad, wird ein paar Zeilen vorher aus einer Ini-Datei gelesen. Dachte, wäre nicht wichtig, da nur einzelne Einträge nicht gelesen wurden.
Also, der Dateninhalt von myPfad ist nicht das Problem.
Gruß, Voxe
Narses - Di 20.12.11 19:12
Moin!
Voxe hat folgendes geschrieben : |
Desweiteren werden Unterverzeichnisse ignoriert. |
Das ist klar, denn dein Code enthält keine Rekursion, die für Unterverzeichnisse nötig wäre. :idea: ;)
Weiterhin solltest du besser große Blöcke für dein StringArray anfordern (oder gleich eine TStringList nehmen, die macht das alles von alleine), da du sonst (bei vielen Dateien) ordentlich deinen Speicher quälst... :?
cu
Narses
rushifell - Di 20.12.11 19:19
Narses hat folgendes geschrieben: |
Weiterhin solltest du besser große Blöcke für dein StringArray anfordern (oder gleich eine TStringList nehmen, die macht das alles von alleine), da du sonst (bei vielen Dateien) ordentlich deinen Speicher quälst... |
Abgesehen davon sollte es ungefähr so aussehen:
Delphi-Quelltext
1: 2: 3: 4: 5: 6: 7: 8:
| idx:=0; ... Inc(idx); SetLength(Datei,idx); Datei[idx-1] := SR.Name; ... For i:=Low(Datei) to High(Datei) do ShowMessage(Datei[i]); |
Ich würde jedoch auch eine Stringlist verwenden.
Voxe - Di 20.12.11 19:30
Ok, Ok,
ihr habt ja Recht. Aber mein eigentliches Problem ist, das einige Einträge nicht in meinem Feld eingetragen wurden.
Und nach einem blödem hin und her kopieren waren sie wieder da (keine Attribute verändert, oder gibt es mehr wie im Explorer sichtbar oder System-Datei), aber man kann doch nicht immer schauen ob alles da ist.
Ist es denn richtig, das diese Vorgehensweise die Dateiattribute ignoriert ?
Gruß, Voxe
Nachtrag: Und danke Nersgatt, ich hoffe dein Link hilft mir. Werde es mit dem faNewAnyFileEx machen und hoffe ich bekomme das Problem nie wieder.
rushifell - Di 20.12.11 19:38
Da Du sowieso nach einem Dateityp suchst, kannst Du Dir das faDirectory auch sparen. Versuchs doch mal mit:
Delphi-Quelltext
1:
| if FindFirst(myPfad+'*.txt', faAnyFile, SR) = 0 then |
Ich denke auch, dass es an den Dateiattributen liegen sollte.
bummi - Di 20.12.11 20:13
@rushifell
er will gerade die Directories nicht mit ausgeben, auch wenn man üblicherweise nicht subtrahiert sondern logisch vernüpft war sein Ansatz diesbezüglich richtig.
Zitat: |
Abgesehen davon sollte es ungefähr so aussehen:
|
warum?
rushifell - Mi 21.12.11 00:50
bummi hat folgendes geschrieben: |
er will gerade die Directories nicht mit ausgeben, auch wenn man üblicherweise nicht subtrahiert sondern logisch vernüpft war sein Ansatz diesbezüglich richtig. |
Wenn er nach einem bestimmten Dateityp sucht, werden die Verzeichnisse überhaupt nicht aufgelistet. Deshalb ist es hier überflüssig, die Verzeichnisse von der Suche auszuschließen, oder liege ich da falsch?
bummi hat folgendes geschrieben: |
Zitat: | Abgesehen davon sollte es ungefähr so aussehen: |
warum? |
Weil die Länge des Arrays ansonsten unnötigerweise immer um einen Wert zu hoch gesetzt wird. Die Zählung eines dynamischen Arrays beginnt doch eigentlich immer bei 0 (wie das auch bei einer Stringlist der Fall ist)? Natürlich funktioniert der Code im ersten Beitrag. Allerdings bleibt Datei[0] bzw. Datei[Low(Datei)] immer leer. Ich selbst bin über Verbesserungsvorschläge eigentlich immer dankbar, auch wenn sie nicht unbedingt zur Lösung des Problems beitragen. :-)
Viele Grüße
bummi - Mi 21.12.11 01:15
Wenn man davon ausgeht das man Verzeichnisse üblicherweise nicht .txt benennt hast Du Recht, ich bin gedanklich bereits von der, von uns allen wahrscheinlich längst verwendeten, generischen Lösung ausgegangen wo eine derartige Einschränkung durchaus Sinn machen kann.
in Punkt 2 hattest Du auch recht ich hatte +1 in SetLength(Datei,idx+1); übersehen, ansonsten finde ich seine Variante etwas lesbarer.
Entwickler-Ecke.de based on phpBB
Copyright 2002 - 2011 by Tino Teuber, Copyright 2011 - 2025 by Christian Stelzmann Alle Rechte vorbehalten.
Alle Beiträge stammen von dritten Personen und dürfen geltendes Recht nicht verletzen.
Entwickler-Ecke und die zugehörigen Webseiten distanzieren sich ausdrücklich von Fremdinhalten jeglicher Art!