Delphi-PRAXiS
Seite 2 von 2     12   

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)

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 07:13 Uhr.
Seite 2 von 2     12   

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