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.