Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   GUI-Design mit VCL / FireMonkey / Common Controls (https://www.delphipraxis.net/18-gui-design-mit-vcl-firemonkey-common-controls/)
-   -   Netzwerk-Adresse/UNC-Pfad zu normalem Pfad konvertieren (https://www.delphipraxis.net/207078-netzwerk-adresse-unc-pfad-zu-normalem-pfad-konvertieren.html)

DieDolly 22. Feb 2021 20:49

Netzwerk-Adresse/UNC-Pfad zu normalem Pfad konvertieren
 
Gibt es eine Möglichkeit einen Netzwerk-Pfad wie beispielsweise \\nas\media1 so zu verarbeiten, dass ich den gemappten Laufwerksbuchstaben und Pfad in Windows davon bekomme?
\\nas\media1 ist in Windows mit S:\ gemappt und dem Standard-Namen "media1 (\\nas)".

Wenn ich einen Pfad \\nas\media1\geschnitten habe, würde ich nach dem Konvertieren gerne S:\geschnitten erhalten. Ist sowas möglich?

KodeZwerg 22. Feb 2021 21:59

AW: Netzwerk-Adresse/UNC-Pfad zu normalem Pfad konvertieren
 
Hi Dolly, MicMic hat auf meinem Eintrag noch nicht geantwortet. Kannst Du den Code von hier mal testen?
Ich habe zZt. keinen echten Pc hier um das zu machen.

Sonst fällt mir nur ein sich mal mit WMI Objects mal anzufreunden oder Dein eigener Tipp aus dem Link :)

DieDolly 22. Feb 2021 22:23

AW: Netzwerk-Adresse/UNC-Pfad zu normalem Pfad konvertieren
 
Dein Code ergibt, wenn man ihn mit "\\nas\media1" aufruft => "\\?\UNC\nas\media1".

bernau 23. Feb 2021 04:29

AW: Netzwerk-Adresse/UNC-Pfad zu normalem Pfad konvertieren
 
Vielleicht das?

DieDolly 23. Feb 2021 07:19

AW: Netzwerk-Adresse/UNC-Pfad zu normalem Pfad konvertieren
 
Das mappt ein Laufwerk. Gemappt ist es ja schon.

Dalai 23. Feb 2021 10:45

AW: Netzwerk-Adresse/UNC-Pfad zu normalem Pfad konvertieren
 
Also was in jedem Fall geht, ist Folgendes: logische Laufwerke ermitteln, diese durchlaufen und daraus die Buchstaben der Netzlaufwerke (DRIVE_REMOTE) ermitteln. Vielleicht kann man sogar gleich nur die Netzlaufwerke holen, aber da wüsste ich aktuell nicht, mit welcher Funktion das ginge. Sobald man die Netzlaufwerke hat, kann man mit MSDN-Library durchsuchenWNetGetConnection oder MSDN-Library durchsuchenWNetGetUniversalName für jeden Buchstaben den zugehörigen UNC-Pfad holen. Und am Ende müsstest du nur noch mit dem gegebenen UNC-Pfad vergleichen und bei Übereinstimmung hast du den passenden Buchstaben gefunden.

Ist eigentlich logisch, dass es nur Funktionen für diese Richtung (Buchstabe -> UNC-Pfad) gibt, denn ein Netzlaufwerk muss einem UNC-Pfad zugeordnet sein, aber ein UNC-Pfad muss nicht notwendigerweise als Netzlaufwerk gemappt sein. Aber aus obigen Informationen kannst du dir ja sowas basteln.

Grüße
Dalai

DieDolly 23. Feb 2021 10:56

AW: Netzwerk-Adresse/UNC-Pfad zu normalem Pfad konvertieren
 
Klingt kompliziert. Wäre alles gar nicht nötig, wenn Das TreeView von MustangpeakVirtualshellTools das unterstützen würde.
Ich benutze das von MustangpeakVirtualshellTools, weil ich es nicht hinbekomme einen "Explorer" (mit CheckBoxen und "anchecken" aller Nodes anhand einer StringList) mit dem normalen VirtualStringTree nachzubilden.

TiGü 23. Feb 2021 12:11

AW: Netzwerk-Adresse/UNC-Pfad zu normalem Pfad konvertieren
 
Zitat:

Zitat von DieDolly (Beitrag 1483582)
Klingt kompliziert.

Du schreibst das ziemlich oft.
Aber genau darum geht es bei der Entwicklung von Software und dem Programmieren an und für sich.
Man löst komplizierte Probleme. Die Lösungen bilden das manchmal ab.
Wenn man nicht gewillt ist, sich darauf einzulassen, hat man vielleicht den falschen Job bzw. ein unpassendes Hobby gewählt.

Wobei hier der Lösungsvorschlag von Dalei ziemlich trivial ist und auf ein paar Zeilen in einer kleinen Klasse zu erschlagen ist.

Du iterierst von A bis Z die Laufwerkbuchstaben.
Die Laufwerke, die per GetDriveType() Funktion ein DRIVE_REMOTE zurückliefen, merkst du dir in einem Container.
Es bietet sich TDictionary<string, string> an. Wobei der Key der UNC-Pfad ist und Value dann der Laufwerksbuchstabe.
Wenn du dann im weiteren Programverlauf ein UNC-Pfad bekommst, kannst du dein Dictionary einfach nach dem Laufwerksbuchstaben fragen.

DieDolly 23. Feb 2021 12:17

AW: Netzwerk-Adresse/UNC-Pfad zu normalem Pfad konvertieren
 
Zitat:

Du schreibst das ziemlich oft.
Kompliziert heißt ja nicht unmöglich :P

bernau 23. Feb 2021 12:25

AW: Netzwerk-Adresse/UNC-Pfad zu normalem Pfad konvertieren
 
Zitat:

Zitat von DieDolly (Beitrag 1483546)
Das mappt ein Laufwerk. Gemappt ist es ja schon.

OK. Hatte ich falsch verstanden.

KodeZwerg 23. Feb 2021 12:59

AW: Netzwerk-Adresse/UNC-Pfad zu normalem Pfad konvertieren
 
Delphi-Quellcode:
unit uMain;

interface

uses

Winapi.Windows, Winapi.Messages, System.SysUtils, System.Variants, System.Classes, Vcl.Graphics,

 Vcl.Controls, Vcl.Forms, Vcl.Dialogs, Vcl.StdCtrls, Vcl.ExtCtrls;

type

TfrmMain = class(TForm)
   pnlMain: TPanel;
   pnlServer: TPanel;
   lblServer: TLabel;
   edtServer: TEdit;
   pnlShare: TPanel;
   lblShare: TLabel;
   edtShare: TEdit;
   pnlResolve: TPanel;
   pnlButton: TPanel;
   btnResolve: TButton;
   edtResult: TEdit;
   procedure btnResolveClick(Sender: TObject);
end;

var
 frmMain: TfrmMain;

implementation

{$R *.dfm}

const
  netapi = 'netapi32.dll';

function NetApiBufferFree(Buffer: Pointer): DWORD; stdcall; external netapi;
function NetShareGetInfo(ServerName, NetName: PWideChar; Level: DWORD; out Buffer: Pointer): DWORD; stdcall; external netapi;

function GetSharePath(const ServerName, ShareName: string): string;
const
  NERR_Success = 0;
type
  PShareInfo2 = ^TShareInfo2;
  TShareInfo2 = record
    shi2_netname: PWideChar;
    shi2_type: DWORD;
    shi2_remark: PWideChar;
    shi2_permissions: DWORD;
    shi2_max_uses: DWORD;
    shi2_current_uses: DWORD;
    shi2_path: PWideChar;
    shi2_passwd: PWideChar;
  end;
var
  ErrorCode: DWORD;
  Buffer: Pointer;
begin
  Result := '';
  ErrorCode := NetShareGetInfo(PWideChar(ServerName), PWideChar(ShareName), 2, Buffer);
  try
    if (ErrorCode = NERR_Success) then
      Result := PShareInfo2(Buffer)^.shi2_path;
  finally
    NetApiBufferFree(Buffer);
  end;
end;

procedure TfrmMain.btnResolveClick(Sender: TObject);
begin
// Wenn UNC-Pfad so in etwa ausschaut " \\MyServer\MyShare\MyData\MyFiles\SomeFile.txt "
// String in 3 Teile zerlegen und die Edit Felder so bestücken
// Teil 1: edtServer.Text = \\MyServer   (Wichtig, mit zwei \\ beginnen!)
// Teil 2: edtShare.Text = MyShare      (Wichtig, nur den Share-Namen ohne \)
  edtResult.Text := GetSharePath(edtServer.Text, edtShare.Text);
// und als ergebnis bekommt man den Pfad zu "MyShare"
// Teil 3: den Rest des Strings wieder rankleben und es sollte funzen.

// getestet mit Delphi Rio 32bit build / aktuelles Windows 10 / Lokal erstelltes Share

// Ungetestet: Share's die per Username/Passwort gesichert sind...

end;

end.

DieDolly 23. Feb 2021 13:30

AW: Netzwerk-Adresse/UNC-Pfad zu normalem Pfad konvertieren
 
Ich habe deinen Beitrag noch nicht gesehen bevor ich losgelegt habe.
Hier ist meine Version (ohne Klassen?)

Delphi-Quellcode:
uses System.IOUtils, System.Generics.Collections;

type
 TDriveTypes = (dtDRIVE_UNKNOWN, dtDRIVE_NO_ROOT_DIR, dtDRIVE_REMOVABLE, dtDRIVE_FIXED, dtDRIVE_REMOTE, dtDRIVE_CDROM, dtDRIVE_RAMDISK, dtIgnore);

 {$R *.dfm}

function GetDriveType(const APath: string): TDriveTypes;
var
 Drive: Char;
begin
 if Length(APath) >= 1 then
  begin
   Drive := APath[1];
   Result := TDriveTypes(Winapi.Windows.GetDriveType(PChar(Drive + ':\')));
  end
 else
  Result := TDriveTypes.dtDRIVE_UNKNOWN;
end;

procedure GetDiskDriveLetters(var List: TStringList; LimitedToDriveType: TDriveTypes = TDriveTypes.dtIgnore);
var
 Drives: TArray<string>;
 Drive: string;
begin
 if not Assigned(List) then
  Exit;

 List.BeginUpdate;
 try
  List.Clear;

  Drives := TDirectory.GetLogicalDrives;
  for Drive in Drives do
   begin
    if (LimitedToDriveType = TDriveTypes.dtIgnore) or //
     ((LimitedToDriveType <> TDriveTypes.dtIgnore) and (GetDriveType(Drive) = LimitedToDriveType)) then
     List.Add(Drive);
   end;
 finally
  List.EndUpdate;
 end;
end;

procedure TForm2.Button1Click(Sender: TObject);
var
 S: string;
 List: TStringList;
 UNCPath2DriveLetterDictionary: TDictionary<string, string>;
begin
 List := TStringList.Create;
 try
  // Hole alle Laufwerksbuchstaben des Typs "dtDRIVE_REMOTE" und lege sie in "List" ab
  GetDiskDriveLetters(List, TDriveTypes.dtDRIVE_REMOTE);

  if List.Count > 0 then
   begin
    UNCPath2DriveLetterDictionary := TDictionary<string, string>.Create;
    try
     for S in List do
      begin
       // ExpandUNCFileName('S') >> \\nas\media1\
       UNCPath2DriveLetterDictionary.Add(ExpandUNCFileName(S), S);
      end;

     // Test
     showmessage(UNCPath2DriveLetterDictionary.Items['\\nas\media1\']);
    finally
     UNCPath2DriveLetterDictionary.Free;
    end;
   end;
 finally
  List.Free;
 end;
end;

KodeZwerg 23. Feb 2021 13:44

AW: Netzwerk-Adresse/UNC-Pfad zu normalem Pfad konvertieren
 
Ist doch super zwei Lösungen zu haben.

Total unterschiedliche Ansätze.

Ich per WinApi direkt, Du iterierst Dich ans Ziel.

Viel Spaß beim testen :-)

DieDolly 23. Feb 2021 16:24

AW: Netzwerk-Adresse/UNC-Pfad zu normalem Pfad konvertieren
 
GetDriveType und GetDiskDriveLetters habe ich schon in einer Unit deswegen habe ich die genutzt.
Das mit der WinAPI würde ich auch gerne nutzen. Aber mein Vorgehen beim "Splitten" der eingehenden Zeichenkette wäre alles andere als schön und vielleicht sogar anfällig.

KodeZwerg 23. Feb 2021 18:43

AW: Netzwerk-Adresse/UNC-Pfad zu normalem Pfad konvertieren
 
Ich habe mal mit meinem Code rumgespielt.
Solange die App als Ziel Windows ist, kann man mit simplen Pos() und Copy() alles sicher umsetzen. Auch ein " \\?\UNC " kann man gleich per StringeReplace() entfernen lassen.

Ja schaut erstmal grausig aus aber man erspart sich das schlafende Laufwerke geweckt werden (falls das ein Thema sein könnte).

Ich kann Dir gerne eine alpha-version davon geben, doch denk ich mir das Du genug Erfahrung mit String-manipulation hast.

Am Ziel bist Du ja eh schon angekommen 8)


Alle Zeitangaben in WEZ +1. Es ist jetzt 04:25 Uhr.

Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz