Einzelnen Beitrag anzeigen

MicMic

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

Netzwerkadressen usw. auslesen

  Alt 14. Feb 2021, 19: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