Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Win32/Win64 API (native code) (https://www.delphipraxis.net/17-win32-win64-api-native-code/)
-   -   Volumennamen eines Mapped Network Drives herausfinden (https://www.delphipraxis.net/196106-volumennamen-eines-mapped-network-drives-herausfinden.html)

Shadowwalker 23. Apr 2018 17:27

Volumennamen eines Mapped Network Drives herausfinden
 
Ich zerbreche mir seit Tagen den Kopf darüber wie man den Volumennamen eines Mapped Network Drives zurückbekommt.
Gibt es eine geeignete Windowsfunktion mit welcher es möglich ist anhand von \\NAS\files_shadow den Volumennamen zu erhalten?
Man kann auch einfach mit Pos und Copy den hinteren Teil rauskopieren, aber das ist nicht der richtige Weg denke ich.

timog 23. Apr 2018 17:58

AW: Volumennamen eines Mapped Network Drives herausfinden
 
Meinst Du sowas
Delphi-Quellcode:
ExtractFileName(ExcludeTrailingPathDelimiter('\\NAS\files_shadow\'))
(Missbrauch des Filenames)

KodeZwerg 23. Apr 2018 18:25

AW: Volumennamen eines Mapped Network Drives herausfinden
 
Einer dieser Befehle kann dabei helfen um an Laufwerk Information zu gelangen.
GetLogicalDriveStrings, GetLogicalDrives, GetDriveType, GetVolumeInformation, und DefineDosDevice.
Ich hoffe das es Dir mit Deinem Problem weiterhilft.

Shadowwalker 23. Apr 2018 18:49

AW: Volumennamen eines Mapped Network Drives herausfinden
 
Leider bekomme ich es nicht hin den an mein Laufwerk verknüpften Buchstaben zu bekommen wenn die Eingabe \\NAS\files_shadow ist.

timog 23. Apr 2018 18:54

AW: Volumennamen eines Mapped Network Drives herausfinden
 
Hatte Dich wohl falsch verstanden: Du hast die Freigabe \\NAS\files_shadow\ der auf Laufwerk X: gemappt ist. Nun möchtest Du wissen, auf welchen UNC-Pfad Laufwerk X: gemappt ist?

Shadowwalker 23. Apr 2018 18:56

AW: Volumennamen eines Mapped Network Drives herausfinden
 
Genau umgekehrt.

Für den von dir genannten Weg habe ich schon eine Lösung, die tatsächlich auch GetLogicalDriveStrings und Konsorten nutzt.
Andersherum, also von \\NAS\files_shadow (oder einem Pfad im Allgemeinen) zu X, Y oder welcher Buchstabe auch immer gemappt ist, dafür habe ich keine Lösung.

KodeZwerg 23. Apr 2018 19:02

AW: Volumennamen eines Mapped Network Drives herausfinden
 
Zeige doch mal den Code Ausschnitt wie/wo Du "\\NAS\files_shadow\" gesetzt wird/erhalten hast.
Zeige doch mal den Code Ausschnitt wie/wo Du Zugriffe darauf startest.

Shadowwalker 23. Apr 2018 19:04

AW: Volumennamen eines Mapped Network Drives herausfinden
 
\\NAS\files_shadow steht fest im Code drin als
Delphi-Quellcode:
const NAS_Laufwerk: string = '\\NAS\files_shadow';
Zugriffe habe ich gerade noch keine da drauf, weil ich nicht an den Laufwerksbuchstaben komme (rein theoretisch erst einmal).

timog 23. Apr 2018 19:15

AW: Volumennamen eines Mapped Network Drives herausfinden
 
Vielleicht so: Lauf alle gemappten Laufwerke mit WNetGetConnection durch, und schau, ob es einen oder mehrere Treffer gibt:

Delphi-Quellcode:
var
  LDrive: Char;
  LPathRemote: array[0..MAX_PATH] of Char;
  LPathLength: DWord;
begin
  LPathLength:=MAX_PATH;
  for LDrive:='A' to 'Z' do begin
    if WNetGetConnection(PChar(''+LDrive+':'), LPathRemote, LPathLength) = NO_ERROR then ShowMessage(LPathRemote);
  end;
Anstelle des ShowMessage dann die Überprüfung auf = NAS_Laufwerk einbauen.

KodeZwerg 23. Apr 2018 19:25

AW: Volumennamen eines Mapped Network Drives herausfinden
 
ExpandUNCFileName das sollte Dein Problem lösen hoffe ich.
edit
Neee. Tut mir leid. Der macht genau das Gegenteil, sorry!

Shadowwalker 23. Apr 2018 19:31

AW: Volumennamen eines Mapped Network Drives herausfinden
 
ExpandUNCFileName macht aus einem Pfad wie \\NAS\share etwas wie C:\Users\....\aktuelles verzeichnis\\NAS\share.

Die Lösung mit WNetGetConnection gibt mir genau das zurück was ich suche.
Lässt sich das auch auf Laufwerke aller Typen anwenden?

timog 23. Apr 2018 19:59

AW: Volumennamen eines Mapped Network Drives herausfinden
 
Zitat:

Zitat von Shadowwalker (Beitrag 1400279)
Lässt sich das auch auf Laufwerke aller Typen anwenden?

Welche Typen meinst Du denn?

Shadowwalker 23. Apr 2018 19:59

AW: Volumennamen eines Mapped Network Drives herausfinden
 
Der Typ ist unwichtig. Einfach quer durch von A bis z =)

Es geht ja da drum, dass man durch alle Laufwerke gehen kann und den Anzeigenamen bekommt.
Aber wenn die Eingabe sowas wie \\NAS\files_shadow ist, sind die mir bekannten Windows-Funktionen nicht mehr arbeitsfähig.

Meine Variante / Idee, die aber einen gravierenden Nachteil hat: ich werde die Eingabe \\NAS... in keinster Weise mehr aus.

Delphi-Quellcode:
procedure GetDiskDriveLetters(List: TStringList);
var
 vDrivesSize: Cardinal;
 vDrives: array [0 .. 128] of Char;
 vDrive: PChar;
begin
 List.BeginUpdate;

 try
  List.Clear;
  vDrivesSize := GetLogicalDriveStrings(SizeOf(vDrives), vDrives);

  if vDrivesSize = 0 then
   Exit;

  vDrive := vDrives;

  while vDrive^ <> #0 do
   begin
    List.Add(StrPas(vDrive));
    Inc(vDrive, SizeOf(vDrive));
   end;
 finally
  List.EndUpdate;
 end;
end;

function GetVolumeName(const aDriveLetter: Char): string;
var
 DriveInfo: TSHFileInfo;
 Res: string;
 sl: TStringList;
 i: Integer;
begin
 sl := TStringList.Create;

 try
  GetDiskDriveLetters(sl);

  for i := 0 to sl.Count - 1 do
   begin
    if AnsiSameText(AnsiUpperCase(aDriveLetter) + ':\', AnsiUpperCase(sl.Strings[i])) then
     begin
      FillChar(DriveInfo, SizeOf(DriveInfo), 0);

      if SHGetFileInfo(PChar(aDriveLetter + ':\'), 0, DriveInfo, SizeOf(DriveInfo), SHGFI_DISPLAYNAME) <> 0 then
       Res := Trim(StringReplace(DriveInfo.szDisplayName, ' (' + Copy(aDriveLetter + ':\', 1, 2) + ')', '', [rfReplaceAll])) // Lokaler Datenträger (C:) => Lokaler Datenträger
      else
       RaiseLastOSError;

      Break;
     end;
   end;
 finally
  sl.Free;
 end;

 Result := Res;
end;


var
 LDrive: Char;
 LPathRemote: array [0 .. MAX_PATH] of Char;
 LPathLength: DWORD;
 VolumeName: string;
begin
 for LDrive := 'A' to 'Z' do
  begin
   VolumeName := GetVolumeName(LDrive);
 
   if VolumeName .... then
  end;
end;


Alle Zeitangaben in WEZ +1. Es ist jetzt 10:09 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