![]() |
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? |
AW: Netzwerk-Adresse/UNC-Pfad zu normalem Pfad konvertieren
Hi Dolly, MicMic hat auf meinem Eintrag noch nicht geantwortet. Kannst Du den Code von
![]() 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 :) |
AW: Netzwerk-Adresse/UNC-Pfad zu normalem Pfad konvertieren
Dein Code ergibt, wenn man ihn mit "\\nas\media1" aufruft => "\\?\UNC\nas\media1".
|
AW: Netzwerk-Adresse/UNC-Pfad zu normalem Pfad konvertieren
|
AW: Netzwerk-Adresse/UNC-Pfad zu normalem Pfad konvertieren
Das mappt ein Laufwerk. Gemappt ist es ja schon.
|
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
![]() ![]() 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 |
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. |
AW: Netzwerk-Adresse/UNC-Pfad zu normalem Pfad konvertieren
Zitat:
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. |
AW: Netzwerk-Adresse/UNC-Pfad zu normalem Pfad konvertieren
Zitat:
|
AW: Netzwerk-Adresse/UNC-Pfad zu normalem Pfad konvertieren
Zitat:
|
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 23:39 Uhr. |
Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024-2025 by Thomas Breitkreuz