Entwickler-Ecke

Dateizugriff - Ordnersuche


Bomania - Di 25.03.03 19:54
Titel: Ordnersuche
Hallo,

ich möchte nach einem Ordner suchen lassen, um dessen Existenz zu überprüfen. Allerdings mit relativer Angabe, DirectoryExists wird deshalb hier nicht greifen. Zum Beispiel möchte ich einen Ordner "Test" auf der Festplatte/Partition C: suchen lassen. Dieser könnte sich evt unter C:\Programme befinden, oder auch unter C:\Dokumente und Einstellungen... - sprich, der Ordner kann sich irgendwo auf der Festplatte befinden. Hat da jemand zufällig eine Funktion für, oder kann mir da jemand eine API-Funktion nennen?

Danke und Gruß


wulfskin - Di 25.03.03 20:06

Hallo Bomania!

Da du ja die Ausbildung zum Fachinformatiker geniest, musst du lernen dir selbst zu helfen ;)! Deshalb hier nur ein paar Stichwörter (bin zu faul gerade für mehr):Das sollte schon reichen!

Gruß wulfskin!


Bomania - Di 25.03.03 20:13

wulfskin hat folgendes geschrieben:
Da du ja die Ausbildung zum Fachinformatiker gewinnst, musst du lernen dir selbst zu helfen ;)


:roll: Eine Ausbildung zum Fachinformatiker "gewinnen". Ich verstehe deine Anspielung nicht ganz. Naja, Ausbildung hin oder her - du hast dann wohl anscheinend das Prinzip eines Forums noch nicht verstanden :wink:

Trotzdem danke für deine Hilfe...


wulfskin - Di 25.03.03 20:56

Ok, damit du nicht sauer wirst, folgt gleich ein Stück Quellcode. Aber ich dachte du kommst damit auch so klar. Achja sollte "geniest" heissen und war eigentlich ein Witz!

Gruß wulfskin!

Nachtrag:

Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
18:
19:
20:
21:
22:
23:
//Ungetestet, ich hoffe es geht!

procedure SucheOrdner(OrdnerName, SuchPfad: String;
  var ErgebnisListe: TStringList);
var
  SR: TSearchRec;
begin
  if  (Length(OrdnerName) > 0)
  and (AnsiLastChar(OrdnerName) <> '\') then
    OrdnerName := OrdnerName + '\';
  if FindFirst(SuchPfad + '*.*', faAnyFile, SR) = 0 then begin
    repeat
      if  (SR.Name <> '.')
      and (SR.Name <> '..') then begin
        if CompareText(SR.Name, OrdnerName) = 0 then
          ErgebnisListe.Add(SuchPfad + SR.Name);
        if (SR.Attr AND faDirectory) > 0 then
          SucheOrdner(OrdnerName, SuchPfad + SR.Name, ErgebnisListe);
      end;
    until FindNext(SR) <> 0;
  end;
  FindClose(SR);
end;


Bomania - Di 25.03.03 21:19

ich und sauer 8)

nein im ernst, ich bin auch schon mit Stichwörtern zufrieden, ein Beispiel als Quellcode ist natürlich noch besser :)

Danke für die Hilfe


Bomania - Di 25.03.03 23:27

Ach, eine kleine Frage hätt ich da noch. Wo wird in deiner Prozedur das Ergebnis abgespeichert, bzw. wie/wo kann ich das Ergebnis der Suche abfragen?


mars - Di 25.03.03 23:41

In der StringListe ErgebnisListe. Deshalb wird dieser Parameter mit var davor aufgerufen.


Bomania - Mi 26.03.03 16:38

Aso ok verstanden. Aber wie kann ich nun den Wert, der in der Stringliste steht, auslesen?


Quelltext
1:
2:
3:
4:
5:
procedure Tfrm_Main.FormCreate(Sender: TObject);
var dieliste:TStringList;
begin
  SucheOrdner('Programme','C:\',dieliste);
end;


Weil eigentlich will ich ja nur wissen, ob das angegebene Verzeichnis irgendwo existiert.


mars - Mi 26.03.03 16:47

Ergebnisliste deklarierst du als globale Variable und übergibst die der Suchfunktion als Parameter. Nach dem Aufruf der Suchfunktion hast du in der Ergebnisliste alle Treffer für deinen Ordnernamen. Auslesen kannst du sie folgendermassen:

Quelltext
1:
2:
For i:=0 to Ergebnisliste.Count-1 do
 ShowMessage(Ergebnisliste[i]);


Hoffe dir geholfen zu haben


Bomania - Mi 26.03.03 16:52

"Zugriffsverletzung bei Adresse xyz...Lesen von Adresse 00000000"

:? Jetzt weiß ich auch nicht mehr weiter


mars - Mi 26.03.03 16:54

Hast du vor dem Aufruf der Suchfunktion

Quelltext
1:
Ergebnisliste := TStringList.Create                    

?


Delete - Mi 26.03.03 16:56

Und zum Schluß bitte wieder ein Free und das ganze am liebsten in einem try-finally-Block.


mars - Mi 26.03.03 16:59

Luckie hat folgendes geschrieben:
Und zum Schluß bitte wieder ein Free und das ganze am liebsten in einem try-finally-Block.


Weshalb try-finally? Was kann denn da schiefgehen?


Delete - Mi 26.03.03 17:01

Wenn deine Suche abstürzt, wird die StringListe nicht wieder freigegeben - zum Beispiel.


Bomania - Mi 26.03.03 17:04

Trotz Create kommt der Ausnahmefehler. Weshalb muss ich eigentlich die Variable "ErgebnisListe" global deklarieren, wenn in der Funktion SucheOrdner ebenfalls eine Variable "ErgebnisListe" deklariert wird? Wird dann nicht die Funktionsinterne ErgebnisListe verwendet?


mars - Mi 26.03.03 17:10

Sorry, global war falsch. Ich meinte einfach in der Prozedur, aus der die Suchfunktion gestartet wird. :oops:
So wie ich das verstanden habe (und es soll mich ruhig jemand korrigieren, wenn ich daneben liege), wird bei einem Parameter mit var einfach ein Zeiger auf die übergebene Variable gebraucht. Somit ändert sich einfach jeweils der Wert am Speicherort, auf welchen der Zeiger zeigt.


Bomania - Mi 26.03.03 17:16

:lol: Huch, jetzt hat er noch eben den Text geändert...So sieht die Verwendung von Pointern also in Delphi aus?