Autor Beitrag
Voxe
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 41

Win XP, Win 7
Delphi 7 prof
BeitragVerfasst: Di 20.12.11 18:32 
Hallo zusammen,

mein Ziel, alle Dateinamen eines definierten Verzeichnisses in einem string-array zu speichern.

ausblenden 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
ontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic starofftopic star
Beiträge: 1581
Erhaltene Danke: 279


Delphi 10 Seattle Prof.
BeitragVerfasst: Di 20.12.11 18:44 
Wo wird "myPfad" denn ein Wert zugewiesen? :lupe:

_________________
Gruß, Jens
Zuerst ignorieren sie dich, dann lachen sie über dich, dann bekämpfen sie dich und dann gewinnst du. (Mahatma Gandhi)
Voxe Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 41

Win XP, Win 7
Delphi 7 prof
BeitragVerfasst: 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
ontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic starofftopic star
Beiträge: 1581
Erhaltene Danke: 279


Delphi 10 Seattle Prof.
BeitragVerfasst: Di 20.12.11 19:09 
Dann mal den Thread lesen, bitte:
www.delphipraxis.net...en-mit-attr-e-c.html

_________________
Gruß, Jens
Zuerst ignorieren sie dich, dann lachen sie über dich, dann bekämpfen sie dich und dann gewinnst du. (Mahatma Gandhi)
Narses
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Administrator
Beiträge: 10183
Erhaltene Danke: 1256

W10ent
TP3 .. D7pro .. D10.2CE
BeitragVerfasst: Di 20.12.11 19:12 
Moin!

user profile iconVoxe hat folgendes geschrieben Zum zitierten Posting springen:
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

_________________
There are 10 types of people - those who understand binary and those who don´t.
rushifell
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 306
Erhaltene Danke: 14



BeitragVerfasst: 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:
ausblenden 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 Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 41

Win XP, Win 7
Delphi 7 prof
BeitragVerfasst: 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
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 306
Erhaltene Danke: 14



BeitragVerfasst: Di 20.12.11 19:38 
Da Du sowieso nach einem Dateityp suchst, kannst Du Dir das faDirectory auch sparen. Versuchs doch mal mit:
ausblenden Delphi-Quelltext
1:
if FindFirst(myPfad+'*.txt', faAnyFile, SR) = 0 then					

Ich denke auch, dass es an den Dateiattributen liegen sollte.
bummi
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 1248
Erhaltene Danke: 187

XP - Server 2008R2
D2 - Delphi XE
BeitragVerfasst: 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
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 306
Erhaltene Danke: 14



BeitragVerfasst: 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
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 1248
Erhaltene Danke: 187

XP - Server 2008R2
D2 - Delphi XE
BeitragVerfasst: 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