| Autor |
Beitrag |
Gausi
      
Beiträge: 8554
Erhaltene Danke: 481
Windows 7, Windows 10
D7 PE, Delphi XE3 Prof, Delphi 10.3 CE
|
Verfasst: Do 11.05.06 14:03
Ich verwende folgenden Code, um rekursiv einen Ordner nach Dateien zu durchsuchen. Den Parameter Pfad bekomme ich über einen TFolderBrowser-Dialog, wie er hier im Forum zu finden ist.
Delphi-Quelltext 1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11: 12: 13: 14: 15: 16: 17: 18: 19: 20: 21: 22:
| procedure TForm1.SucheNeueMP3s(pfad:string); var sr : TSearchrec; begin if AnsiEndsStr('\', pfad) then pfad:=Copy(Pfad,1,length(pfad)-1); if findfirst(pfad+'\*',FaAnyfile,sr) = 0 then repeat if (sr.name<>'.') AND (sr.name<>'..') then begin end; until Findnext(sr)<>0; findclose(sr); if findfirst(pfad+'\*',FaDirectory,sr)=0 then repeat if (sr.name<>'.') AND (sr.name<>'..') then SucheNeueMP3s(pfad+'\'+sr.name); until Findnext(sr)<>0; findclose(sr); end; |
Das Problem ist, dass dieser Code nicht richtig funktioniert, wenn man in diesem Dialog den "Arbeitsplatz" auswählt. Dann ist der Pfad ein Leerstring. Es werden dann zwar alle Ordner auf dem Laufwerk durchsucht, auf dem auch die Exe liegt, aber das "C:" fehlt bei allen Pfadangaben.
Ein erster Versuch war, die Dateinamen über ExpandFilename zu vervollständigen, was auch klappt, aber es wird dann halt trotzdem nur eine Platte durchsucht.
Frage ist also, wie kann ich den "Arbeitsplatz" komplett durchsuchen. Die Idee, bei einem Leerstring als Ergebnis des Dialogs eine Schleife über alle Laufwerke zu machen, finde ich nicht ganz das Wahre. Geht das auch anders?
_________________ We are, we were and will not be.
|
|
F34r0fTh3D4rk
      
Beiträge: 5285
Erhaltene Danke: 29
Win Vista (32), Win 7 (64)
Eclipse, SciTE, Lazarus
|
Verfasst: Do 11.05.06 18:41
Frag doch ab, ob es sich um den arbeitsplatz handelt und gehe dann alle platten, discs, dokuemnte eigene dateien usw manuell durch. der arbeitsplatz ist ja kein ordner in dem sinne sondern nur eine übersicht aller medien (+ den dokumenten zeugs)
|
|
BenBE
      
Beiträge: 8721
Erhaltene Danke: 191
Win95, Win98SE, Win2K, WinXP
D1S, D3S, D4S, D5E, D6E, D7E, D9PE, D10E, D12P, DXEP, L0.9\FPC2.0
|
Verfasst: Do 11.05.06 18:56
Der Arbeitsplatz hat eine eindeutige GUID, die Du vom FolderBrowser zurückbekommst. Mit Hilfe dieser kannst Du Dir über die SH-Funktionen der WinAPI die Verzeichnisse anhand der GUID auflisten lassen. Wenn einer GUIDL ein Pfad zugeordnet ist, kannst Du die jetzige Funktion für den Pfad als Stammpfad nutzen, ist dies nicht der Fall, durchsuchst Du anhand der SH-Funktionen den Ordner, indem Du Dir das zugehörige IShellFolder-Interface geben lässt.
_________________ Anyone who is capable of being elected president should on no account be allowed to do the job.
Ich code EdgeMonkey - In dubio pro Setting.
|
|
Gausi 
      
Beiträge: 8554
Erhaltene Danke: 481
Windows 7, Windows 10
D7 PE, Delphi XE3 Prof, Delphi 10.3 CE
|
Verfasst: Do 11.05.06 19:55
@Fear: Genau diese Variante kam mir ja auch schon in den Kopf. Das Problem ist, dass ich mit dem TFolderBrowser-Dialog einen Leerstring für den Arbeitsplatz zurückbekommen, was imho nicht besonders eindeutig auf den Arbeitsplatz hinweist
Ich verwende diesen Dialog (den ganz unten).
@BenBE: Ich muss gestehen, dass ich selten an einem Beitrag so wenig verstanden habe  Also. Der Browser-Dialog, den man über die Api bekommt SHBrowseForFolder liefert eine PItemIDList zurück, die man mit der Shellfunktion SHGetPathFromIDList in einen Pfad "umwandeln" kann. Das wird ja in der Funktion aus der Library gemacht.
Dem Arbeitsplatz ist aber kein Pfad zugeordnet, weswegen das Ding aus der Library einen Leerstring als Pfad zurückliefert. Ich hoffe, bis dahin habe ich mir das richtig zusammengereimt.
Aber jetzt hörts auf... | Zitat: | | [ dann ] durchsuchst Du anhand der SH-Funktionen den Ordner, indem Du Dir das zugehörige IShellFolder-Interface geben lässt. |
Hä???
(Die Intelligenz eines Menschen erkennt man an seinen Fragen. )
_________________ We are, we were and will not be.
|
|
BenBE
      
Beiträge: 8721
Erhaltene Danke: 191
Win95, Win98SE, Win2K, WinXP
D1S, D3S, D4S, D5E, D6E, D7E, D9PE, D10E, D12P, DXEP, L0.9\FPC2.0
|
Verfasst: Do 11.05.06 20:28
Gausi hat folgendes geschrieben: | @BenBE: Ich muss gestehen, dass ich selten an einem Beitrag so wenig verstanden habe Also. Der Browser-Dialog, den man über die Api bekommt SHBrowseForFolder liefert eine PItemIDList zurück, die man mit der Shellfunktion SHGetPathFromIDList in einen Pfad "umwandeln" kann. Das wird ja in der Funktion aus der Library gemacht.
Dem Arbeitsplatz ist aber kein Pfad zugeordnet, weswegen das Ding aus der Library einen Leerstring als Pfad zurückliefert. Ich hoffe, bis dahin habe ich mir das richtig zusammengereimt.
Aber jetzt hörts auf... | Zitat: | | [ dann ] durchsuchst Du anhand der SH-Funktionen den Ordner, indem Du Dir das zugehörige IShellFolder-Interface geben lässt. | Hä??? |
Gut, zur Erklärung. Jeder PItemIDList ist ein vvirtueller Ordner von Windows zugeordnet. So haben auch Ordner wie der Arbeitsplatz, der Desktop und dein Papierkorb eine PItemIDList als "Pfadangabe" zugeordnet.
Die Shell bietet nun die Möglichkeit, sich für eine beliebige PItemIDList ein Interface IShellFolder zu erzeugen, was ein Abbild der im Explorer dargestellten Objekte ist. Dieser Objekte umfassen dann nicht nur normale Ordner auf der Festplatte, sondern auch alle virtuellen Ordner, due Windows bereitstellt.
Leider hab ich für einen genauen Source noch zu wenig mit der Shell gearbeitet, ich denke aber im MSDN sollte sich zu SHGetDesktop-Folder und IShellFolder auch ein Beispiel-Source anfinden.
Gausi hat folgendes geschrieben: | (Die Intelligenz eines Menschen erkennt man an seinen Fragen. ) |
Oder seiner Art auszuweichen *g*
_________________ Anyone who is capable of being elected president should on no account be allowed to do the job.
Ich code EdgeMonkey - In dubio pro Setting.
|
|
Gausi 
      
Beiträge: 8554
Erhaltene Danke: 481
Windows 7, Windows 10
D7 PE, Delphi XE3 Prof, Delphi 10.3 CE
|
Verfasst: Do 11.05.06 21:22
Huu...Das wird hart.
Also, wenn ich bei dem Code aus der Library bleiben will (um ihn ggf zu erweitern), müsste ich also, wenn SHGetPathFromIDList keinen Pfad zurückliefert, über die Pidl, die SHBrowseForFolder liefert, mich erst durch die MSDN-Doku durcharbeiten, da die richtigen Api-Befehle verstehen, dann richtig anwenden, um den Inhalt des "Pidl-Ding" aufzulisten, und dann z.B. über den Aufruf von GetAttributesOf herauszufinden, ob und welche Subitems des gewählten "Pidl-Dings" Ordner sind, um so eine Ordnerliste zu erhalten, die ich dann einzeln mit der Suchroutine, die ich schon habe, durchsuchen kann.
Eine Alternative wäre, dass ich einfach überprüfe, ob "Arbeitsplatz" oder "Desktop" ausgewählt wurde (das dürfte noch übersichtlich möglich sein mit meinen Kenntnissen), und dann einfach alle Laufwerke durchsuche.
Wenn auch das fehlschlägt, bekommt der User dann eine Meldung, dass er z.B. bitte nicht die Systemsteuerung oder die Netzwerkumgebung durchsuchen lassen sollte. Ist auch nicht ganz das wahre, aber für die Verwaltung von Dateien, die irgendwo im Netzwerk rumliegen, ist das Programm auch nicht gedacht...
Darüber muss ich noch ne Weile grübeln, fürchte ich...
_________________ We are, we were and will not be.
|
|
Dominique
      
Beiträge: 92
|
Verfasst: Fr 12.05.06 08:57
Gausi hat folgendes geschrieben: | | Huu...Das wird hart. |
Nee, das wird nicht hart:
siehe www.delphipraxis.net: Pfad der "Special Folders" ermitteln .
Viel Erfolg,
Dominique
|
|
Gausi 
      
Beiträge: 8554
Erhaltene Danke: 481
Windows 7, Windows 10
D7 PE, Delphi XE3 Prof, Delphi 10.3 CE
|
Verfasst: Fr 12.05.06 09:08
Doch, das wird wohl hart
"Desktop" und "Eigene Dateien" etc. haben ja einen Pfad. Den bekomme ich auch mit (Auszug:) Delphi-Quelltext 1: 2: 3:
| pidlResult := SHBrowseForFolder (BrowseInfo); If pidlResult <> nil Then SHGetPathFromIDList (pidlResult, Path); |
Das Problem ist, dass dem "Arbeitsplatz" kein Pfad zugeordnet ist, sondern eine Liste von Objekten (Laufwerke, Gemeiname Doukumente, Dateien von {user}, Systemsteuerung) zugeordnet ist. Da müsste ich die einzelnen Objekte durchgehen, und ggf. ignorieren oder den zugehörigen Pfad (z.B. "C:") herausfinden. 
_________________ We are, we were and will not be.
|
|
Dominique
      
Beiträge: 92
|
Verfasst: Fr 12.05.06 09:41
Wenn Du ohnehin nur "lokale" Laufwerke/Verzeichnisse durchsuchen willst, dann schränk doch gleich von vornherein den BrowsForFolder-Dialog mit "BIF_RETURNONLYFSDIRS" ein.
Delphi-Quelltext 1: 2: 3: 4: 5: 6: 7: 8: 9:
| var browse_info: TBrowseInfo; . . begin browse_info.ulFlags = BIF_RETURNONLYFSDIRS | BIF_STATUSTEXT;
. ... |
|
|
|