Entwickler-Ecke

Dateizugriff - Wie kann ich Dateien eines Ordners herausfinden


webmaker - Mo 26.08.02 21:25
Titel: Wie kann ich Dateien eines Ordners herausfinden
HAllo Leute,
Ich hab da mal ne Frage und zwar wie kann ich alle Datein bzw. auch nur einige in eine TStringlist schreiben, sodass ich sie später z.b. in eine Listbox oder so packen kann???


Renegade - Mo 26.08.02 21:40

Schon mal was davon gehört :twisted: :

Zitat:
Hinweis Schauen Sie vor dem Posten in die FAQ!



Guckst du hier: http://www.auq.de/viewtopic.php?t=1107


Millo - Mo 26.08.02 21:41

Moin

Für solche fälle kann man eigentlich ganz gut die FileListBox und die DirectoryListbox Komponenten der Registrierkarte Win 3.1 verwenden.


Renegade - Mo 26.08.02 21:43

@Millo

kommt immer darauf an, ob der user darauf einfluß haben soll oder nicht. :)

Gruß Renegade


Millo - Di 27.08.02 12:38

@Renegade

:oops: Hast wohl recht.


@webmaker

Sonst gibt es auch noch Komponenten wie ShellListView und ShellTreeView.

Der Code für einen solchen zugriff ist ungefähr immer gleich.
mit diesem hier kann kriegst du alle Markierten Dateien( Er zeigt alle Selectierten Einträge der ShellListView in der ListBox an):


Quelltext
1:
2:
3:
4:
5:
for x:=0 to ShellListView1.Items.Count-1 do
begin
if ShellListView1.Items.Item[x].Selected then
ListBox1.Items.Add(ShellListView1.Folders[x].DisplayName);
end;


Für den Namen:

Quelltext
1:
ShellListView1.Folders[x].DisplayName;                    


webmaker - Di 27.08.02 15:15

Danke, das mit der Faq habe ich leider nicht gesehen.
Dennoch habe ich zwei Fragen und zwar sagt er bei FindClose, dass es incompatible Typen: Cardinal und TSearchRec seien. Vorher habe ich diesen Code in einem leeren Formular gehabt, stoppte er nicht.
Wenn ich findclose rausnehme funktioniert es trotzdem noch.
2. Wenn ich in einen Ordner gehe, in dem noch weitere Ordner sind, so zeigt er die auch in der Listbox an
QuellCode:

Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
18:
19:
20:
21:
22:
23:
24:
25:
26:
27:
28:
29:
30:
31:
32:
33:
34:
35:
36:
37:
38:
39:
40:
41:
42:
43:
44:
45:
Procedure FindFiles (aPath, aFindMask: String; aWithSub: Boolean; aResult: tStrings);
Var
  FindRec5: tSearchRec;
Begin
  // Wenn die Stringliste nil ist oder aPath oder aFind nicht angegeben ist
  // dann raus
  If (aPath = '') or (aFindMask = '') or Not Assigned (aResult) Then
    Exit;

  // Wenn am Ende der Pfadangabe noch kein \ steht, dieses hinzufügen
  If aPath[Length (aPath)] <> '\' Then
    aPath := aPath + '\';

  // Im aktuellen Verzeichnis nach der Datei suchen
  If FindFirst (aPath + aFindMask, faAnyFile, FindRec5) = 0 Then
    Repeat
      If (FindRec5.Name <> '.') and (FindRec5.Name <> '..') Then
        // ...Ergebnis in die Stringlist einfügen
//        aResult.Clear;
        aResult.Add (FindRec5.Name);
    Until FindNext (FindRec5) <> 0;
// FindClose(FindRec5);

  // Wenn nicht in Unterverzeichnissen gesucht werden soll dann raus
  If Not aWithSub Then
    Exit;

  // In Unterverzeichnissen weiter suchen
  If FindFirst (aPath + '*.*', faAnyFile, FindRec5) = 0 Then
    Repeat
      If (FindRec5.Name <> '.') and (FindRec5.Name <> '..') Then
        // Feststellen, ob es sich um ein Verzeichnis handelt
        If Boolean (FindRec5.Attr and faDirectory) Then
          // Funktion erneut aufrufen, um Verzeichnis zu durchsuchen (Rekursion)
          FindFiles (aPath + FindRec5.Name, aFindMask, aWithSub, aResult);
    Until FindNext (FindRec5) <> 0;

//   FindClose (FindRec5);
End;

procedure TFrameForm.ShellTreeView1DblClick(Sender: TObject);
begin
     browserlistbox.Clear;
     FindFiles (ShellTreeView1.Path, '*.*', False, browserlistbox.Items);
end;


Delete - Di 27.08.02 15:57

webmaker hat folgendes geschrieben:
Danke, das mit der Faq habe ich leider nicht gesehen.

Man sollte solche Quellen immer vorher zu Rate ziehen. :wink:

Zitat:
... und zwar sagt er bei FindClose, dass es incompatible Typen: Cardinal und TSearchRec seien.

Bei dir kommen sich die Units "Windows" und "SysUtils" in die Quere. In beiden stecken Routinen zum Suchen der Dateien. Beim Suchen selbst passiert nichts, da die Namen unterschiedlich sind. Nur "FindClose" ist in beiden Fällen identisch. Du solltest deshalb

Quelltext
1:
SysUtils.                    

vor die "FindClose"-Zeilen setzen. (Den Punkt nicht vergessen!)

Zitat:
Wenn ich findclose rausnehme funktioniert es trotzdem noch.

Das ist aber ein Fehler, und das solltest du ganz schnell wieder rückgängig machen.


webmaker - Di 27.08.02 16:14

Ist klar das FindClos drin sein muss. Jetzt klappt es auch. Danke
Nur das er die Verzeichnisse mit in der Lsitbox auflistet ist doof, wie kriege ich die weg????