Autor Beitrag
Gausi
ontopic starontopic starontopic starontopic starontopic starontopic starofftopic starofftopic star
Beiträge: 8554
Erhaltene Danke: 481

Windows 7, Windows 10
D7 PE, Delphi XE3 Prof, Delphi 10.3 CE
BeitragVerfasst: 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.
ausblenden 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
    //    showmessage(pfad);
    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
          //Code zum einfügen der Datei in die internen Listen
        end;
    until Findnext(sr)<>0;
    findclose(sr);
    // rekursiv in den Unterordnern suchen
    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
ontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic starofftopic star
Beiträge: 5285
Erhaltene Danke: 29

Win Vista (32), Win 7 (64)
Eclipse, SciTE, Lazarus
BeitragVerfasst: 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
ontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic starofftopic star
Beiträge: 8721
Erhaltene Danke: 191

Win95, Win98SE, Win2K, WinXP
D1S, D3S, D4S, D5E, D6E, D7E, D9PE, D10E, D12P, DXEP, L0.9\FPC2.0
BeitragVerfasst: 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 Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starofftopic starofftopic star
Beiträge: 8554
Erhaltene Danke: 481

Windows 7, Windows 10
D7 PE, Delphi XE3 Prof, Delphi 10.3 CE
BeitragVerfasst: 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 :gruebel: 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.:lol:)

_________________
We are, we were and will not be.
BenBE
ontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic starofftopic star
Beiträge: 8721
Erhaltene Danke: 191

Win95, Win98SE, Win2K, WinXP
D1S, D3S, D4S, D5E, D6E, D7E, D9PE, D10E, D12P, DXEP, L0.9\FPC2.0
BeitragVerfasst: Do 11.05.06 20:28 
user profile iconGausi hat folgendes geschrieben:
@BenBE: Ich muss gestehen, dass ich selten an einem Beitrag so wenig verstanden habe :gruebel: 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.

user profile iconGausi hat folgendes geschrieben:
(Die Intelligenz eines Menschen erkennt man an seinen Fragen.:lol:)

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 Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starofftopic starofftopic star
Beiträge: 8554
Erhaltene Danke: 481

Windows 7, Windows 10
D7 PE, Delphi XE3 Prof, Delphi 10.3 CE
BeitragVerfasst: 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
ontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic starofftopic star
Beiträge: 92



BeitragVerfasst: Fr 12.05.06 08:57 
user profile iconGausi 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 Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starofftopic starofftopic star
Beiträge: 8554
Erhaltene Danke: 481

Windows 7, Windows 10
D7 PE, Delphi XE3 Prof, Delphi 10.3 CE
BeitragVerfasst: 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:)
ausblenden 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
ontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic starofftopic star
Beiträge: 92



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

ausblenden Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
var
  browse_info: TBrowseInfo;
  .
  .
  begin
  browse_info.ulFlags = BIF_RETURNONLYFSDIRS | BIF_STATUSTEXT;

  .
  ...