Autor Beitrag
Bomania
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 139

Win XP

BeitragVerfasst: Di 25.03.03 19:54 
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
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 1349
Erhaltene Danke: 1

Win XP
D5 Pers (SSL), D2005 Pro, C, C#
BeitragVerfasst: 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):
  • TSearchRec
  • FindFirst, FindNext
  • Rekursive Prozedur
Das sollte schon reichen!

Gruß wulfskin!

_________________
Manche antworten um ihren Beitragszähler zu erhöhen, andere um zu Helfen.


Zuletzt bearbeitet von wulfskin am Di 25.03.03 20:55, insgesamt 1-mal bearbeitet
Bomania Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 139

Win XP

BeitragVerfasst: 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
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 1349
Erhaltene Danke: 1

Win XP
D5 Pers (SSL), D2005 Pro, C, C#
BeitragVerfasst: 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:
ausblenden 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;

_________________
Manche antworten um ihren Beitragszähler zu erhöhen, andere um zu Helfen.
Bomania Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 139

Win XP

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

Win XP

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

Debian Woody, Win 2000, Win XP
D7 Ent, Kylix 3
BeitragVerfasst: Di 25.03.03 23:41 
In der StringListe ErgebnisListe. Deshalb wird dieser Parameter mit var davor aufgerufen.
Bomania Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 139

Win XP

BeitragVerfasst: Mi 26.03.03 16:38 
Aso ok verstanden. Aber wie kann ich nun den Wert, der in der Stringliste steht, auslesen?

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

Debian Woody, Win 2000, Win XP
D7 Ent, Kylix 3
BeitragVerfasst: 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:
ausblenden Quelltext
1:
2:
For i:=0 to Ergebnisliste.Count-1 do
 ShowMessage(Ergebnisliste[i]);


Hoffe dir geholfen zu haben
Bomania Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 139

Win XP

BeitragVerfasst: Mi 26.03.03 16:52 
"Zugriffsverletzung bei Adresse xyz...Lesen von Adresse 00000000"

:? Jetzt weiß ich auch nicht mehr weiter
mars
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 238

Debian Woody, Win 2000, Win XP
D7 Ent, Kylix 3
BeitragVerfasst: Mi 26.03.03 16:54 
Hast du vor dem Aufruf der Suchfunktion
ausblenden Quelltext
1:
Ergebnisliste := TStringList.Create					

?
Luckie
Ehemaliges Mitglied
Erhaltene Danke: 1



BeitragVerfasst: Mi 26.03.03 16:56 
Und zum Schluß bitte wieder ein Free und das ganze am liebsten in einem try-finally-Block.
mars
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 238

Debian Woody, Win 2000, Win XP
D7 Ent, Kylix 3
BeitragVerfasst: 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?
Luckie
Ehemaliges Mitglied
Erhaltene Danke: 1



BeitragVerfasst: Mi 26.03.03 17:01 
Wenn deine Suche abstürzt, wird die StringListe nicht wieder freigegeben - zum Beispiel.
Bomania Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 139

Win XP

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

Debian Woody, Win 2000, Win XP
D7 Ent, Kylix 3
BeitragVerfasst: 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 Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 139

Win XP

BeitragVerfasst: 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?