AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Programmierung allgemein Netzwerke Netzwerkadressen usw. auslesen

Netzwerkadressen usw. auslesen

Ein Thema von MicMic · begonnen am 14. Feb 2021 · letzter Beitrag vom 15. Feb 2021
Antwort Antwort
MicMic

Registriert seit: 26. Mai 2018
296 Beiträge
 
Delphi 10.2 Tokyo Starter
 
#1

Netzwerkadressen usw. auslesen

  Alt 14. Feb 2021, 20:31
Hallo,
ich navigiere mit meinem Programm durch lokale Festplatten, zeige Dateien und Ordner an und kann meine lokale Laufwerke dazu auch auswählen. Soweit so gut. Jetzt komme ich an einem Punkt und muss mich mit Netzwerken beschäftigen. Darauf will ich mit meinem Programm auch zugreifen und die Dateien/Ordner auslesen. Habe da schon so manches ausprobiert. Zum Beispiel wie ich auf die FRITZ.NAS zugreifen kann (mit Login/Passwort). Alles noch nicht so einfach. Aber ich bin dabei

Was ich aber sowieso noch brauche, ist eine Liste. Also nicht nur eine Laufwerksliste, sondern dann auch dieses Netzwerk-Zeugs. Zum Beispiel habe ich im Win10-Explorer unter Netzwerk mein PC und mein Notebook (wenn er an ist). Auch habe ich einen 1&1 SmartDrive Cloud Speicher (als Laufwerk Z). Im Explorer erscheint der u.a. auch im Bereich "Netzwerkadressen". Mit dem unten stehenden Source kann ich da herankommen. Also der Zugriff geht nicht nur über Laufwerk "Z", sondern auch über "\\1&1\SmartDrive\Ordner1". Zumindest auf "Ordner1" denn bei "\\1&1\SmartDrive\" versagt FindFirst/NextFile. Trotzdem brauche ich eine Liste. So in etwa:

C:
D:
E:
----
\\DESKTOP-RECHNER
\\NOTEBOOK
\\1&1

Wähle ich "\\DESKTOP-RECHNER" aus, soll eine Liste der freigegebenen Ordner aufgelistet werden. Bei "\\1&1" soll dann "SmartDrive" aufgelistet werden. Wenn man "tiefer" gehen möchte, dann bekommt man bei 1&1 natürlich den "Ordner1" aufgelistet. Nur letzteres geht mit FindFirst/NextFile. Auch kann man mit diesen Funktionen nur in die freigegebenen Ordner selbst z.B. von "\\DESKTOP-RECHNER" hereinschauen. Also eine Liste der freigegebenen Order bekommt man mit FindFirst/NextFile nicht. Irgendwie verstehe ich es aber noch nicht so ganz *lach ... aber dafür habe ich ja unten stehender Source und man kann sich da was zusammenbasteln, damit man später eine richtige Liste hat und man damit hinein navigieren kann.

Aber bevor ich da herumexperimentiere, habe ich mal einen FTP Uni Server im Explorer mit "Netzwerkadresse hinzufügen" hinzugefügt. Dieser wird im Explorer auch im Abschnitt "Netzwerkadressen" angezeigt (als Typ Dateiordner). Also dort habe ich ja auch "1&1 SmartDrive (Z)" stehen (als Typ Netzwerklaufwerk). Der UNI Eintrag wird jedenfalls mit dem untenstehenden Source nicht ausgelesen. Das hätte ich gerne, damit ich später in meinem Programm in diesem Server auch durchnavigieren kann. Ich will mich halt vermehrt an einer einzulesenden Liste orientieren und nicht selbst dem Anwender die Möglichkeit bieten, irgendwas hinzufügen zu können. Das soll der Anwender später alles schön selbst im Explorer tun. Also mit dem Source kann an schon was machen aber ich verstehe noch nicht, warum der UNI Server hiermit dann nicht auch ausgelesen werden kann (so wie der 1&1 SmartDrive Eintrag).

Aber reichen nicht eigentlich nur Laufwerke aus? Den UNI Server kann man bestimmt im Explorer auch einem Laufwerksbuchstaben zuordnen und mit meinem Programm kann ich dann einfach auf dieses Laufwerk zugreifen. Wie sehen es hier Endanwender? Damit wird sich ja beschäftigt, sprich auf dieses UNC-Zeugs. Wieso eigentlich? Wenn man alles im Explorer zu einem Laufwerksbuchstaben zuordnen kann, warum dann dieser Schritt hier? Was spricht dafür, was dagegen? Das ist es nämlich... ich habe einfach zum Thema Netzwerk keinerlei praktische Erfahrungen. Ich programmiere einen Datei-Manager der so seine guten Gimicks hat. Aber natürlich soll dieser auch richtig mit den Netzwerk-Zeugs umgehen können (wenn das wichtig ist? <- wie gesagt, Explorer Laufwerkszuordnung usw. geht ja auch). Wollte mir schon so eine NAS-Diskstation kaufen... damit ich lerne wie alles funktioniert usw. aber das wäre noch zu früh

Delphi-Quellcode:
unit Unit1;

interface

uses
  Winapi.Windows, Winapi.Messages, System.SysUtils, System.Variants, System.Classes, Vcl.Graphics,
  Vcl.Controls, Vcl.Forms, Vcl.Dialogs, Vcl.StdCtrls;

type
  TForm1 = class(TForm)
    ListBox1: TListBox;
    Button1: TButton;
    procedure Button1Click(Sender: TObject);
  private
    { Private-Deklarationen }
  public
    { Public-Deklarationen }
  end;

type
  PNetResourceArray = ^TNetResourceArray;
  TNetResourceArray = array[0..100] of TNetResource;

var
  Form1: TForm1;

implementation

{$R *.dfm}



function CreateNetResourceList
(NetResource: PNetResource; out Entries: DWord; out List: PNetResourceArray): Boolean;
var
  EnumHandle: THandle;
  BufSize: DWord;
  Res: DWord;
begin
  Result := False;
  List := Nil;
  Entries := 0;
  if WNetOpenEnum(
                  RESOURCE_GLOBALNET,
                  RESOURCETYPE_DISK,
                  0,
                  NetResource,
                  EnumHandle) = NO_ERROR then begin
    try
      BufSize := $4000; // 16 kByte
      GetMem(List, BufSize);
      try
        repeat
          Entries := DWord(-1);
          FillChar(List^, BufSize, 0);
          Res := WNetEnumResource(EnumHandle, Entries, List, BufSize);
          if Res = ERROR_MORE_DATA then
          begin
            ReAllocMem(List, BufSize);
          end;
        until Res <> ERROR_MORE_DATA;

        Result := Res = NO_ERROR;
        if not Result then
        begin
          FreeMem(List);
          List := Nil;
          Entries := 0;
        end;
      except
        FreeMem(List);
        raise;
      end;
    finally
      WNetCloseEnum(EnumHandle);
    end;
  end;
end;

procedure ScanNetworkResources(List: TStrings);

procedure ScanLevel(NetResource: PNetResource);
var
  Entries: DWord;
  NetResourceList: PNetResourceArray;
  i: Integer;
begin

  if CreateNetResourceList(NetResource, Entries, NetResourceList) then
  try


    for i := 0 to Integer(Entries) - 1 do
    begin
        form1.Listbox1.items.Add
          (
            NetResourceList[i].lpRemoteName+
            '|'+ inttostr(NetResourceList[i].dwScope)+
            '|'+ inttostr(NetResourceList[i].dwType)+
            '|'+ inttostr(NetResourceList[i].dwDisplayType)
          );
        if (NetResourceList[i].dwUsage and RESOURCEUSAGE_CONTAINER) <> 0
          then ScanLevel(@NetResourceList[i]);
    end;


  finally
    FreeMem(NetResourceList);
  end;
end;

begin
  ScanLevel(Nil);
end;

procedure TForm1.Button1Click(Sender: TObject);
begin
  ScanNetworkResources(ListBox1.Items);
end;

end.
  Mit Zitat antworten Zitat
Benutzerbild von himitsu
himitsu

Registriert seit: 11. Okt 2003
Ort: Elbflorenz
38.708 Beiträge
 
Delphi 10.4 Sydney
 
#2

AW: Netzwerkadressen usw. auslesen

  Alt 14. Feb 2021, 22:31
Mit dem ShellFolders-Zeugs kannst dich durch alles hangeln ... alles, was der Explorer auch links anzeigt.
MSDN-Library durchsuchenSHGetFolderLocation

Allerdings scheinen viele Teile dieser API bald verschwinden zu sollen, siehe Kommentar da oben.
MSDN-Library durchsuchenSHFindFiles

Da gibt es viele Einspungpunkte, auch für die Netzwerkumgebung.
https://www.delphipraxis.net/136168-...rlocation.html
CSIDL_NETWORK https://docs.microsoft.com/en-us/win...32/shell/csidl
https://xtream.be/blog/win10shellfolders/
Garbage Collector ... Delphianer erzeugen keinen Müll, also brauchen sie auch keinen Müllsucher.
Delphi-Tage 2005-2014

Geändert von himitsu (14. Feb 2021 um 22:34 Uhr)
  Mit Zitat antworten Zitat
MicMic

Registriert seit: 26. Mai 2018
296 Beiträge
 
Delphi 10.2 Tokyo Starter
 
#3

AW: Netzwerkadressen usw. auslesen

  Alt 15. Feb 2021, 11:27
Ja, dieses Zeugs ist eine Welt für sich. Manches werde ich sowieso nutzen, weil es noch einfach ist.
Aber so ein "CSIDL_NETWORK" (oder FOLDERID_NetworkFolder) bringt mir alleine ja nichts. Mit "SHGetFolderLocation" oder "SHGetSpecialFolderPath" dazu, ist ja noch lange keine Liste da. Deswegen gibt es ja dieses "WNetOpenEnum". Das schwierige ist halt, dass ich die Praxis brauche (bezüglich Netzwerk) um Source programmieren zu können. Ich weiß jetzt halt in meinem Fall, dass ich mit dem genannten Source an meine Inhalte komme (FRITZ.NAS, PC und Notebook), welche im Explorer ebenfalls angezeigt werden. Auch das dieses "1&1 SmartDrive" da drin steckt. Aber was ist mit anderen Dingen? Deshalb brauche ich Praxis denn sonst weiß man gar nicht wie das programmierte reagiert bzw. was man überhaupt erwarten kann.

FTP mache ich jedenfalls extra. Das ist mir jetzt bewusst. Dazu gibt es einfache Beispiele, wie man an den Inhalt eines FTP-Servers kommt. Früher habe ich dazu auch mal ein Test gemacht, wie ich eine Datei mit Delphi zu einem FTP-Server schicken kann.

Wie ich gelesen habe, gibt es z.B. für Google Drive eine API aber man wird schnell gekickt (wegen Zugriffsmengenbeschränkungen). So sieht das auch bei anderen Cloud Anbietern aus. Also wieder eine andere Welt. Alles irgendwie speziell. Erste Erfahrungen dazu hatte ich früher auch mal mit PHP/Javascript usw. als fremde Sachen genutzt wurden. Da gab es irgendwie solche Zugriffsmengenbeschränkungen pro Tag oder so.

Ich frage mich halt (so ganz ohne Praxis) ob ich mit meinem WNetOpenEnum Beispiel erst mal auf den richtigen Weg bin?

um an:
fremde Rechner und freigegebene Ordner zu kommen. Oder gibt es hier auch Unterschiede (vielleicht verschiedene Arbeitsgruppen) und ich muss dazugehörige andere Funktionen nutzen, weil Rechner irgendwie sozusagen nur in Unterordnern/Gruppen gelistet werden?

Schlimm wenn man nicht weiß, welche Fragen man sich selbst stellen muss, um voranzukommen *mmmpfffff
  Mit Zitat antworten Zitat
Themen-Optionen Thema durchsuchen
Thema durchsuchen:

Erweiterte Suche
Ansicht

Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 07:32 Uhr.
Powered by vBulletin® Copyright ©2000 - 2021, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2021 by Daniel R. Wolf