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. |
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; |
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 :-) |
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. |
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. |
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