Autor Beitrag
Xion
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
EE-Maler
Beiträge: 1952
Erhaltene Danke: 128

Windows XP
Delphi (2005, SmartInspect), SQL, Lua, Java (Eclipse), C++ (Visual Studio 2010, Qt Creator), Python (Blender), Prolog (SWIProlog), Haskell (ghci)
BeitragVerfasst: Do 14.12.06 16:16 
ich hab eine Compo geschrieben, die Ordner und Dateien auflistet (erweitertes TreeView). Problem: ich arbeite mit TSearchRec, was an sich keine Probleme bereitet, nur wenn ich direkt nach \\Rechner\ suche gehts nicht. Jemand eine Idee?

ausblenden Codeschnippsel
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
18:
19:
...
Pos:=GetFolderNr(Root,IsRootDir);
  if FindFirst(Root+'*.*', faAnyFile , SearchRec)=0 then
  try
    repeat
      if ((SearchRec.attr and faDirectory)=faDirectory)and(SearchRec.Name<>'.')and(SearchRec.Name<>'..') then
       begin
        FolderSearch(Root+SearchRec.Name+'\');
       end
      else if (SearchRec.Name<>'.')and(SearchRec.Name<>'..') then
       begin
        AddFile(Pos,SearchRec.Name,SearchRec.Size);
       end;

    until FindNext(SearchRec) <> 0;
  finally
    FindClose(SearchRec);
  end;
...


*Edit*
oder gibts etwa eine schnellere Procedure, die das kann? das wäre noch besser.

Moderiert von user profile iconChristian S.: Code- durch Delphi-Tags ersetzt

_________________
a broken heart is like a broken window - it'll never heal
In einem gut regierten Land ist Armut eine Schande, in einem schlecht regierten Reichtum. (Konfuzius)


Zuletzt bearbeitet von Xion am Sa 16.12.06 10:42, insgesamt 1-mal bearbeitet
Xion Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
EE-Maler
Beiträge: 1952
Erhaltene Danke: 128

Windows XP
Delphi (2005, SmartInspect), SQL, Lua, Java (Eclipse), C++ (Visual Studio 2010, Qt Creator), Python (Blender), Prolog (SWIProlog), Haskell (ghci)
BeitragVerfasst: Fr 15.12.06 14:20 
hmmm, hab gehört, des is net sooo einfach...ich glaub ich lass des erstma.

_________________
a broken heart is like a broken window - it'll never heal
In einem gut regierten Land ist Armut eine Schande, in einem schlecht regierten Reichtum. (Konfuzius)
Jakob Schöttl
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 929
Erhaltene Danke: 1


Delphi 7 Professional
BeitragVerfasst: Fr 15.12.06 15:36 
Search Components - Version 2.1 gibts hier (Ich weiß aber nicht, ob das auch für Dateien im Netzwerk geht). Probiers mal aus wenn du willst!
Xion Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
EE-Maler
Beiträge: 1952
Erhaltene Danke: 128

Windows XP
Delphi (2005, SmartInspect), SQL, Lua, Java (Eclipse), C++ (Visual Studio 2010, Qt Creator), Python (Blender), Prolog (SWIProlog), Haskell (ghci)
BeitragVerfasst: Fr 15.12.06 19:55 
thx, ich gucks mir mal an. Aber TSearchRec geht ja auch übers Netzwerk. Es geht mir ja darum, nur den Rechner-Name anzugeben, und er listet alles freigegeben sozusagen auf. Glaube nicht, dass die Compo das kann.

_________________
a broken heart is like a broken window - it'll never heal
In einem gut regierten Land ist Armut eine Schande, in einem schlecht regierten Reichtum. (Konfuzius)
Jakob Schöttl
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 929
Erhaltene Danke: 1


Delphi 7 Professional
BeitragVerfasst: Fr 15.12.06 22:51 
Ach, das hab ich gar nicht gewusst, dass es mit FindFirst und FindNext auch übers netzwerk geht. Die verzeichnisse auflisten kann dann wahrscheinlich die Komponente auch nicht. Schade!
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: Fr 15.12.06 23:17 
Hallo Xion,

ich habe es eben versucht mit \\name\dir\*.* und es hat wunderbar funktioniert (steht auch in der Hilfe zu Suche im MSDN FINDFIRSTFILE, dass das gehen muss). Keine Ahnung was du da falsch machst!

Gruß Hapw!

_________________
Manche antworten um ihren Beitragszähler zu erhöhen, andere um zu Helfen.
Heiko
ontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic starofftopic star
Beiträge: 3169
Erhaltene Danke: 11



BeitragVerfasst: Sa 16.12.06 09:19 
Titel: Re: TSearchRec im Netzwerk
user profile iconXion hat folgendes geschrieben:
oder gibts etwa eine schnellere Procedure, die das kann? das wäre noch besser.


Hupp, wenn du z.B. selber die API aufrufst oder z.B. meine fertige Kapselung der API nimmst (wenn ich vlt. mal langeweile habe, erweitere ich den Filter noch ;) )
Xion Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
EE-Maler
Beiträge: 1952
Erhaltene Danke: 128

Windows XP
Delphi (2005, SmartInspect), SQL, Lua, Java (Eclipse), C++ (Visual Studio 2010, Qt Creator), Python (Blender), Prolog (SWIProlog), Haskell (ghci)
BeitragVerfasst: Sa 16.12.06 10:39 
user profile iconwulfskin hat folgendes geschrieben:
Hallo Xion,

ich habe es eben versucht mit \\name\dir\*.* und es hat wunderbar funktioniert (steht auch in der Hilfe zu Suche im MSDN FINDFIRSTFILE, dass das gehen muss). Keine Ahnung was du da falsch machst!

Gruß Hapw!


jaja, das geht bei mir auch. Ich will ja nur \\name\ angeben und er listet dann alles auf, was auf dem Rechner aufgelistet ist (wenn man in windows \\name\ als Adresse eintippt, dann zeigt er ja auch alles freigegebene an.)

//EDIT: Topicname von TSearchRec im Netzwerk -> TSearchRec im Netzwerk nach \\Rechnername\

_________________
a broken heart is like a broken window - it'll never heal
In einem gut regierten Land ist Armut eine Schande, in einem schlecht regierten Reichtum. (Konfuzius)
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: Sa 16.12.06 10:52 
Wenn ich das richtig sehe, versuchst Du mit FindFile die Freigaben eines Rechners auszulesen. Das geht natürlich nicht ... ich muss mal schauen, hab dafür irgendwo nen Quelltext rumliegen ... im Netzwerk ...

ausblenden volle Höhe Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
18:
19:
20:
21:
22:
23:
24:
25:
26:
27:
28:
29:
30:
31:
32:
33:
34:
35:
36:
37:
38:
39:
40:
41:
42:
43:
44:
45:
46:
47:
48:
49:
50:
51:
52:
53:
54:
55:
56:
57:
58:
59:
60:
61:
62:
63:
64:
65:
66:
67:
68:
69:
70:
71:
72:
73:
74:
75:
76:
77:
78:
79:
80:
81:
82:
83:
Function GetComputerNames: TStringList;
Var
    neh1, neh2, neh3: Cardinal;
    Count: Cardinal;
    x, y, z: Integer;
    net1, net2, net3: PNetResource;
    tmpnet1, tmpnet2, tmpnet3: PNetResource;
    netsize1, netsize2, netsize3: Cardinal;
Begin
    Result := TStringList.Create;
    Try
        WNetOpenEnum(RESOURCE_GLOBALNET, RESOURCETYPE_DISK, 0, Nil, neh1); //Dienstprovider
        Try
            Count := $FFFFFFFF;
            NetSize1 := $FFFF;
            GetMem(Net1, NetSize1);
            Try
                While WNetEnumResource(neh1, Count, net1, netsize1) <> ERROR_NO_MORE_ITEMS Do
                Begin
                    tmpnet1 := net1;
                    If Count = 0 Then
                        Break;
                    For X := 0 To Count - 1 Do
                    Begin
                        WNetOpenEnum(RESOURCE_GLOBALNET, RESOURCETYPE_DISK, 0, tmpnet1, neh2); //Arbeitsgruppen
                        Try
                            Count := $FFFFFFFF;
                            NetSize2 := $FFFF;
                            GetMem(Net2, NetSize2);
                            Try
                                While WNetEnumResource(neh2, Count, net2, netsize2) <> ERROR_NO_MORE_ITEMS Do
                                Begin
                                    tmpnet2 := net2;
                                    If Count = 0 Then
                                        Break;
                                    For Y := 0 To Count - 1 Do
                                    Begin
                                        WNetOpenEnum(RESOURCE_GLOBALNET, RESOURCETYPE_DISK, 0, tmpnet2, neh3); //Computer
                                        Try
                                            Count := $FFFFFFFF;
                                            NetSize3 := $FFFF;
                                            GetMem(Net3, NetSize3);
                                            Try
                                                While WNetEnumResource(neh3, Count, net3, netsize3) <> ERROR_NO_MORE_ITEMS Do
                                                Begin
                                                    tmpnet3 := net3;
                                                    If Count = 0 Then
                                                        Break;
                                                    For Z := 0 To Count - 1 Do
                                                    Begin
                                                        Result.Add(String(tmpnet3^.lpRemoteName));
                                                        Inc(tmpnet3);
                                                    End;
                                                End;
                                            Finally
                                                FreeMem(Net3);
                                            End;
                                        Finally
                                            WNetCloseEnum(neh3);
                                        End;
                                        Inc(tmpnet2);
                                    End;
                                End;
                            Finally
                                FreeMem(Net2);
                            End;
                        Finally
                            WNetCloseEnum(neh2);
                        End;
                        Inc(tmpnet1);
                    End;
                End;
            Finally
                FreeMem(Net1);
      End;
        Finally
            WNetCloseEnum(neh1);
        End;
    Except
        Result.Free;
        Exit;
    End;
End;


Wenn Du in diesem Quelltext an der markierten Stelle eine weitere WNetOpenEnumearation-Anweisungsblock einfügst, so erhälst Du für jeden Rechner im Netzwerk die Freigaben. Die Ausgabe brauchst Du dann nur noch für deine Zwecke filtern. Beachte dabei aber, dass Du dafür auf dem Zielrechner u.U. eine Login-Session benötigst (Wenn das Gast-Konto deaktiviert ist und die Logins sich auf den Rechnern unterscheiden).

_________________
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.
Xion Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
EE-Maler
Beiträge: 1952
Erhaltene Danke: 128

Windows XP
Delphi (2005, SmartInspect), SQL, Lua, Java (Eclipse), C++ (Visual Studio 2010, Qt Creator), Python (Blender), Prolog (SWIProlog), Haskell (ghci)
BeitragVerfasst: Sa 16.12.06 12:00 
thx, hört sich schon mal vielversprechend an ;)

also, ich hab
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:
23:
24:
WNetOpenEnum(RESOURCE_GLOBALNET, RESOURCETYPE_DISK, 0, tmpnet2, neh4); //Computer
  Try
      Count := $FFFFFFFF;
      NetSize4 := $FFFF;
      GetMem(Net4, NetSize4);
      Try
          While WNetEnumResource(neh4, Count, net4, netsize4) <> ERROR_NO_MORE_ITEMS Do
          Begin
              tmpnet4 := net4;
              If Count = 0 Then
                  Break;
              For A := 0 To Count - 1 Do
              Begin
                  Result.Add(String(tmpnet4^.lpRemoteName));
                  Inc(tmpnet4);
              End;
          End;
      Finally
          FreeMem(Net4);
      End;
  Finally
      WNetCloseEnum(neh4);
  End;
  Inc(tmpnet3);


an der markierten Stelle eingesetzt, aber ich bekomme keine freigegebenen Dateien :( aus übersichtlichkeits-gründen wollt ichs rekursiv machen, hat aber irgendwie nicht geklappt.

//EDIT: aah, es muss tmpnet3 statt 2 heißen...jetzt rechnet er grad wie wild...

//EDIT2: ooh, Count > 4Milliarden... so viel ist doch garnet freigegeben (oder kann man damit auch Passwortabfragen umgehen?)

//EDIT3: hmm, aber irgendwie added er nix zu Result...komisch

_________________
a broken heart is like a broken window - it'll never heal
In einem gut regierten Land ist Armut eine Schande, in einem schlecht regierten Reichtum. (Konfuzius)


Zuletzt bearbeitet von Xion am Sa 16.12.06 13:29, insgesamt 1-mal bearbeitet
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: Sa 16.12.06 12:31 
An der Markierten Stelle muss tmpnet3 stehen, der Übergeordnete Ordner, in dem Du "browsen" willst.

Den dann aus deinem unten resultierenden Block schreibst Du an der Stelle der in meinem Source markierten Zeile hin uns probierst dann noch mal.

Passwortabfragen kannst Du damit nicht umgehen ... Wenn Du nicht angemeldet bist, bekommt die API-Funktion nur Fehlercode 5 gemeldet (Zugriff verweigert).

Wenn Du testen willst, ob's wie gewünscht funktioniert, kannste mir ne Kopie geben, in meinem Netz muss sich jeder Rechner nämlich erst anmelden, bevor man Zugriff bekommt.

_________________
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.
Xion Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
EE-Maler
Beiträge: 1952
Erhaltene Danke: 128

Windows XP
Delphi (2005, SmartInspect), SQL, Lua, Java (Eclipse), C++ (Visual Studio 2010, Qt Creator), Python (Blender), Prolog (SWIProlog), Haskell (ghci)
BeitragVerfasst: Sa 16.12.06 13:17 
user profile iconBenBE hat folgendes geschrieben:
An der Markierten Stelle muss tmpnet3 stehen, der Übergeordnete Ordner, in dem Du "browsen" willst.


ja, das hatte ich auch gesehen, deßwegen hab ichs ja markiert (siehe Edit1)

user profile iconBenBE hat folgendes geschrieben:

Den dann aus deinem unten resultierenden Block schreibst Du an der Stelle der in meinem Source markierten Zeile hin uns probierst dann noch mal.

ich hab den Code von oben in deien Code statt der markierten Zeile geschrieben. Ich hab also folgenden Code:

ausblenden volle Höhe Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
18:
19:
20:
21:
22:
23:
24:
25:
26:
27:
28:
29:
30:
31:
32:
33:
34:
35:
36:
37:
38:
39:
40:
41:
42:
43:
44:
45:
46:
47:
48:
49:
50:
51:
52:
53:
54:
55:
56:
57:
58:
59:
60:
61:
62:
63:
64:
65:
66:
67:
68:
69:
70:
71:
72:
73:
74:
75:
76:
77:
78:
79:
80:
81:
82:
83:
84:
85:
86:
87:
88:
89:
90:
91:
92:
93:
94:
95:
96:
97:
98:
99:
100:
101:
102:
103:
104:
105:
Function GetComputerNames: TStringList;
Var
    neh1, neh2, neh3,neh4: Cardinal;
    Count: Cardinal;
    x, y, z,a: Integer;
    net1, net2, net3,net4: PNetResource;
    tmpnet1, tmpnet2, tmpnet3,tmpnet4: PNetResource;
    netsize1, netsize2, netsize3,netsize4: Cardinal;
Begin
    Result := TStringList.Create;
    Try
        WNetOpenEnum(RESOURCE_GLOBALNET, RESOURCETYPE_DISK, 0, Nil, neh1); //Dienstprovider
        Try
            Count := $FFFFFFFF;
            NetSize1 := $FFFF;
            GetMem(Net1, NetSize1);
            Try
                While WNetEnumResource(neh1, Count, net1, netsize1) <> ERROR_NO_MORE_ITEMS Do
                Begin
                    tmpnet1 := net1;
                    If Count = 0 Then
                        Break;
                    For X := 0 To Count - 1 Do
                    Begin
                        WNetOpenEnum(RESOURCE_GLOBALNET, RESOURCETYPE_DISK, 0, tmpnet1, neh2); //Arbeitsgruppen
                        Try
                            Count := $FFFFFFFF;
                            NetSize2 := $FFFF;
                            GetMem(Net2, NetSize2);
                            Try
                                While WNetEnumResource(neh2, Count, net2, netsize2) <> ERROR_NO_MORE_ITEMS Do
                                Begin
                                    tmpnet2 := net2;
                                    If Count = 0 Then
                                        Break;
                                    For Y := 0 To Count - 1 Do
                                    Begin
                                        WNetOpenEnum(RESOURCE_GLOBALNET, RESOURCETYPE_DISK, 0, tmpnet2, neh3); //Computer
                                        Try
                                            Count := $FFFFFFFF;
                                            NetSize3 := $FFFF;
                                            GetMem(Net3, NetSize3);
                                            Try
                                                While WNetEnumResource(neh3, Count, net3, netsize3) <> ERROR_NO_MORE_ITEMS Do
                                                Begin
                                                    tmpnet3 := net3;
                                                    If Count = 0 Then
                                                        Break;
                                                    For Z := 0 To Count - 1 Do
                                                    Begin
                                                       WNetOpenEnum(RESOURCE_GLOBALNET, RESOURCETYPE_DISK, 0, tmpnet3, neh4); //freigegebene Dateien
                                                        Try
                                                            Count := $FFFFFFFF;
                                                            NetSize4 := $FFFF;
                                                            GetMem(Net4, NetSize4);
                                                            Try
                                                                While WNetEnumResource(neh4, Count, net4, netsize4) <> ERROR_NO_MORE_ITEMS Do
                                                                Begin
                                                                    tmpnet4 := net4;
                                                                    If Count = 0 Then
                                                                        Break;
                                                                    For A := 0 To Count - 1 Do
                                                                    Begin
                                                                        Result.Add(String(tmpnet4^.lpRemoteName));
                                                                        Inc(tmpnet4);
                                                                    End;
                                                                End;
                                                            Finally
                                                                FreeMem(Net4);
                                                            End;
                                                        Finally
                                                            WNetCloseEnum(neh4);
                                                        End;
                                                        Inc(tmpnet3);
                                                    End;
                                                End;
                                            Finally
                                                FreeMem(Net3);
                                            End;
                                        Finally
                                            WNetCloseEnum(neh3);
                                        End;
                                        Inc(tmpnet2);
                                    End;
                                End;
                            Finally
                                FreeMem(Net2);
                            End;
                        Finally
                            WNetCloseEnum(neh2);
                        End;
                        Inc(tmpnet1);
                    End;
                End;
            Finally
                FreeMem(Net1);
      End;
        Finally
            WNetCloseEnum(neh1);
        End;
    Except
        Result.Free;
        Exit;
    End;
End;


geht aber irgendwie nicht, wenn ich an der hervorgehobenen Stelle einen Breakpoint setze, sagt er A=4,29 Milliarden, aber er konnt nie in die nächste Zeile und fügt dem Result nix hinzu. Das wiederspricht ja den 4Mrd, weil dann müsste er ja was dazuschreiben.

_________________
a broken heart is like a broken window - it'll never heal
In einem gut regierten Land ist Armut eine Schande, in einem schlecht regierten Reichtum. (Konfuzius)
Xion Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
EE-Maler
Beiträge: 1952
Erhaltene Danke: 128

Windows XP
Delphi (2005, SmartInspect), SQL, Lua, Java (Eclipse), C++ (Visual Studio 2010, Qt Creator), Python (Blender), Prolog (SWIProlog), Haskell (ghci)
BeitragVerfasst: So 17.12.06 10:58 
hmmm, derjenige, für den ich die Compo gemacht hab, hat gemeint, dass es nicht funzt. liegt wohl daran, dass er ftp-Freigaben hat. Jetzt hab ich FtpFindFirstFile gefunden, aber das check ich net ganz, wie ich das dann via LAN umbauen muss. Ich mach mal n neues Topic dafür auf.

//EDIT: hmm, er will jetzt, dass ichs über txt-Datei mache...mal gucken was daraus wird.

_________________
a broken heart is like a broken window - it'll never heal
In einem gut regierten Land ist Armut eine Schande, in einem schlecht regierten Reichtum. (Konfuzius)