| Autor |
Beitrag |
Bomania
      
Beiträge: 139
Win XP
|
Verfasst: 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
      
Beiträge: 1349
Erhaltene Danke: 1
Win XP
D5 Pers (SSL), D2005 Pro, C, C#
|
Verfasst: 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 
      
Beiträge: 139
Win XP
|
Verfasst: 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  |
 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
Trotzdem danke für deine Hilfe...
|
|
wulfskin
      
Beiträge: 1349
Erhaltene Danke: 1
Win XP
D5 Pers (SSL), D2005 Pro, C, C#
|
Verfasst: 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; |
_________________ Manche antworten um ihren Beitragszähler zu erhöhen, andere um zu Helfen.
|
|
Bomania 
      
Beiträge: 139
Win XP
|
Verfasst: Di 25.03.03 21:19
ich und sauer
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 
      
Beiträge: 139
Win XP
|
Verfasst: 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
      
Beiträge: 238
Debian Woody, Win 2000, Win XP
D7 Ent, Kylix 3
|
Verfasst: Di 25.03.03 23:41
In der StringListe ErgebnisListe. Deshalb wird dieser Parameter mit var davor aufgerufen.
|
|
Bomania 
      
Beiträge: 139
Win XP
|
Verfasst: 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
      
Beiträge: 238
Debian Woody, Win 2000, Win XP
D7 Ent, Kylix 3
|
Verfasst: 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 
      
Beiträge: 139
Win XP
|
Verfasst: Mi 26.03.03 16:52
"Zugriffsverletzung bei Adresse xyz...Lesen von Adresse 00000000"
 Jetzt weiß ich auch nicht mehr weiter
|
|
mars
      
Beiträge: 238
Debian Woody, Win 2000, Win XP
D7 Ent, Kylix 3
|
Verfasst: Mi 26.03.03 16:54
Hast du vor dem Aufruf der Suchfunktion
Quelltext 1:
| Ergebnisliste := TStringList.Create |
?
|
|
Luckie
Ehemaliges Mitglied
Erhaltene Danke: 1
|
Verfasst: Mi 26.03.03 16:56
Und zum Schluß bitte wieder ein Free und das ganze am liebsten in einem try-finally-Block.
|
|
mars
      
Beiträge: 238
Debian Woody, Win 2000, Win XP
D7 Ent, Kylix 3
|
Verfasst: 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
|
Verfasst: Mi 26.03.03 17:01
Wenn deine Suche abstürzt, wird die StringListe nicht wieder freigegeben - zum Beispiel.
|
|
Bomania 
      
Beiträge: 139
Win XP
|
Verfasst: 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
      
Beiträge: 238
Debian Woody, Win 2000, Win XP
D7 Ent, Kylix 3
|
Verfasst: Mi 26.03.03 17:10
Sorry, global war falsch. Ich meinte einfach in der Prozedur, aus der die Suchfunktion gestartet wird.
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 
      
Beiträge: 139
Win XP
|
Verfasst: Mi 26.03.03 17:16
 Huch, jetzt hat er noch eben den Text geändert...So sieht die Verwendung von Pointern also in Delphi aus?
|
|