AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Programmierung allgemein GUI-Design mit VCL / FireMonkey / Common Controls Netzwerk-Adresse/UNC-Pfad zu normalem Pfad konvertieren

Netzwerk-Adresse/UNC-Pfad zu normalem Pfad konvertieren

Ein Thema von DieDolly · begonnen am 22. Feb 2021 · letzter Beitrag vom 23. Feb 2021
Antwort Antwort
Seite 2 von 2     12
Benutzerbild von KodeZwerg
KodeZwerg

Registriert seit: 1. Feb 2018
3.042 Beiträge
 
Delphi 10.3 Rio
 
#11

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

  Alt 23. Feb 2021, 13:59
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.
Gruß vom KodeZwerg

Geändert von KodeZwerg (23. Feb 2021 um 14:59 Uhr) Grund: Copy-paste fehler
  Mit Zitat antworten Zitat
DieDolly

Registriert seit: 22. Jun 2018
1.892 Beiträge
 
#12

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

  Alt 23. Feb 2021, 14:30
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;
  Mit Zitat antworten Zitat
Benutzerbild von KodeZwerg
KodeZwerg

Registriert seit: 1. Feb 2018
3.042 Beiträge
 
Delphi 10.3 Rio
 
#13

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

  Alt 23. Feb 2021, 14:44
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
Gruß vom KodeZwerg
  Mit Zitat antworten Zitat
DieDolly

Registriert seit: 22. Jun 2018
1.892 Beiträge
 
#14

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

  Alt 23. Feb 2021, 17:24
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.
  Mit Zitat antworten Zitat
Benutzerbild von KodeZwerg
KodeZwerg

Registriert seit: 1. Feb 2018
3.042 Beiträge
 
Delphi 10.3 Rio
 
#15

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

  Alt 23. Feb 2021, 19:43
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)
Gruß vom KodeZwerg
  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 +2. Es ist jetzt 02:45 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