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;