Autor |
Beitrag |
Voxe
      
Beiträge: 41
Win XP, Win 7
Delphi 7 prof
|
Verfasst: Di 20.12.11 18:32
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
      
Beiträge: 1581
Erhaltene Danke: 279
Delphi 10 Seattle Prof.
|
Verfasst: Di 20.12.11 18:44
Wo wird "myPfad" denn ein Wert zugewiesen? 
_________________ Gruß, Jens
Zuerst ignorieren sie dich, dann lachen sie über dich, dann bekämpfen sie dich und dann gewinnst du. (Mahatma Gandhi)
|
|
Voxe 
      
Beiträge: 41
Win XP, Win 7
Delphi 7 prof
|
Verfasst: 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
|
|
Nersgatt
      
Beiträge: 1581
Erhaltene Danke: 279
Delphi 10 Seattle Prof.
|
Verfasst: Di 20.12.11 19:09
_________________ Gruß, Jens
Zuerst ignorieren sie dich, dann lachen sie über dich, dann bekämpfen sie dich und dann gewinnst du. (Mahatma Gandhi)
|
|
Narses
      

Beiträge: 10183
Erhaltene Danke: 1256
W10ent
TP3 .. D7pro .. D10.2CE
|
Verfasst: 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.
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
_________________ There are 10 types of people - those who understand binary and those who don´t.
|
|
rushifell
      
Beiträge: 306
Erhaltene Danke: 14
|
Verfasst: 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 
      
Beiträge: 41
Win XP, Win 7
Delphi 7 prof
|
Verfasst: 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.
Zuletzt bearbeitet von Voxe am Di 20.12.11 19:40, insgesamt 1-mal bearbeitet
|
|
rushifell
      
Beiträge: 306
Erhaltene Danke: 14
|
Verfasst: 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
      
Beiträge: 1248
Erhaltene Danke: 187
XP - Server 2008R2
D2 - Delphi XE
|
Verfasst: 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?
_________________ Das Problem liegt üblicherweise zwischen den Ohren H₂♂
DRY DRY KISS
|
|
rushifell
      
Beiträge: 306
Erhaltene Danke: 14
|
Verfasst: 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
      
Beiträge: 1248
Erhaltene Danke: 187
XP - Server 2008R2
D2 - Delphi XE
|
Verfasst: 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.
_________________ Das Problem liegt üblicherweise zwischen den Ohren H₂♂
DRY DRY KISS
|
|