| Autor |
Beitrag |
Xion
      

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)
|
Verfasst: 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?
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 Christian 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 
      

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)
|
Verfasst: 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
      
Beiträge: 929
Erhaltene Danke: 1
Delphi 7 Professional
|
Verfasst: 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 
      

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)
|
Verfasst: 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
      
Beiträge: 929
Erhaltene Danke: 1
Delphi 7 Professional
|
Verfasst: 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
      
Beiträge: 1349
Erhaltene Danke: 1
Win XP
D5 Pers (SSL), D2005 Pro, C, C#
|
Verfasst: 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 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
      
Beiträge: 3169
Erhaltene Danke: 11
|
Verfasst: Sa 16.12.06 09:19
Titel: Re: TSearchRec im Netzwerk
Xion 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 
      

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)
|
Verfasst: Sa 16.12.06 10:39
wulfskin hat folgendes geschrieben: | Hallo Xion,
ich habe es eben versucht mit \\name\dir\*.* und es hat wunderbar funktioniert (steht auch in der Hilfe zu 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
      
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: 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 ...
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); 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); 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); 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 
      

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)
|
Verfasst: Sa 16.12.06 12:00
thx, hört sich schon mal vielversprechend an
also, ich hab
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); 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
      
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: 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 
      

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)
|
Verfasst: Sa 16.12.06 13:17
BenBE 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)
BenBE 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:
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); 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); 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); 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); 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 
      

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)
|
Verfasst: 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)
|
|
|