我怎样才能转换像
\Device\HarddiskVolume3\Windows
进入其对应的虚拟路径?(如 c:\Windows 在这种情况下)
我个人更喜欢原生方式:
function GetHDDDevicesWithDOSPath:TStringlist;
var
i: integer;
root: string;
device: string;
buffer: string;
begin
setlength(buffer, 1000);
result:=TStringlist.create;
for i := Ord('c') to Ord('z') do
begin
root := Char(i) + ':';
if (QueryDosDevice(PChar(root), pchar(buffer), 1000) <> 0) then
begin
device := pchar(buffer);
result.add(format('%s = %s\',[device, root ]));
end;
end;
end;
注意:此代码示例取自: http: //www.delphipraxis.net/165249-auflistung-devices.html
这将返回逻辑驱动器和路径之间的映射。就我而言:
\Device\HarddiskVolume2 = c:\
\Device\HarddiskVolume3 = d:\
\Device\IsoCdRom0 = e:\
\Device\CdRom0 = f:\
\Device\hgfs\;Z:0000000000084af9\vmware-host\Shared Folders = z:\
您必须将路径中的“\device\harddisk”部分替换为对应的驱动器号。
请注意,驱动器号取决于用户。一些有用的链接:
一种方法是使用 WMI,例如http://www.magsys.co.uk/delphi/magwmi.asp - 它还有一个演示,您可以使用它来获取代码示例。
您可以找到许多 WMI Explorer 并探索 configuaartiona 类和构造查询。仅举几例免费的:
您还需要在谷歌上搜索 WMI 查询语言示例并阅读规范:虽然 WMI 语言类似于 SQL 查询,但它有一些不同的语法和一组难以预测的非统一限制。
我个人在不同的方向上使用它:我需要制作一个按物理磁盘或网络服务器分组的卷列表(驱动器号)。
我以(快速且非常丑陋,但足以在程序初始化时一次性工作)单元结束,如下所示。您可以对其进行流线化处理,并且您肯定必须反转请求和功能。
unit WMI_Helper;
interface
function WMINetDiskName(const disk: string { 'C:' - w/o slash } ): string;
function WMIPhysDiskName(const disk: string { 'C:' - w/o slash } ): string;
function WMIGetVolumeName(const disk: string { 'C:' - w/o slash } ): string;
implementation
uses magwmi, SysUtils, StrUtils, Windows, IOUtils;
function WMIGetProp(const query, param, resultProp: string): string;
begin
if MagWmiGetOneQ(StringReplace(query, '%s', param, []), resultProp, Result) <= 0
then
Result := '';
Result := Trim(Result);
end;
function WMINetDiskName(const disk: string { 'C:' - w/o slash } ): string;
const
req = 'select ProviderName from Win32_MappedLogicalDisk where DeviceID = "%s"';
prop = 'ProviderName';
var
i: integer;
begin
Result := WMIGetProp(req, disk, prop);
If not TPath.IsUNCPath(Result) then
exit('');
i := PosEx('\', TPath.GetPathRoot(Result), 3);
if i <= 0 then
exit('');
SetLength(Result, i - 1);
end;
function WMIPhysDiskName(const disk: string { 'C:' - w/o slash } ): string;
const
resultProp = 'DeviceID';
reqPart = 'ASSOCIATORS OF {Win32_LogicalDisk.DeviceID="%s"} WHERE ResultClass=Win32_DiskPartition';
reqDisk = 'ASSOCIATORS OF {Win32_DiskPartition.DeviceID="%s"} WHERE ResultClass=Win32_DiskDrive';
begin
Result := WMIGetProp(reqPart, disk, resultProp);
if Result > '' then
Result := WMIGetProp(reqDisk, Result, resultProp);
end;
function WMIGetVolumeName(const disk: string { 'C:' - w/o slash } ): string;
const
prop = 'VolumeName';
reqNet = 'select VolumeName from Win32_MappedLogicalDisk where DeviceID = "%s"';
reqPhy = 'select VolumeName from Win32_LogicalDisk where DeviceID = "%s"';
begin
Result := WMIGetProp(IfThen(GetDriveType(PChar(disk)) = DRIVE_REMOTE, reqNet,
reqPhy), disk, prop);
end;
end.
我没有尝试无字母卷(例如 c:\ 和 c:\Windows 将是一个分区,而 c:\Windows\Temp 将驻留在另一个磁盘上),但如果您需要考虑此类配置,我相信您可以在 WMI Explorer 中进行适当的查询并将其添加到您的程序中。