Delphi-将物理路径(设备文件句柄)转换为虚拟路径

Delphi-将物理路径(设备文件句柄)转换为虚拟路径,delphi,path,virtual,Delphi,Path,Virtual,如何转换路径,如 \设备\硬盘卷3\Windows 进入其相应的虚拟路径?(如本例中的c:\Windows)其中一种方法是使用WMI,例如,它还有一个演示,您可以使用它来获取代码样本 您可以在configuartiona类和构造查询中找到许多WMI资源管理器和资源管理器。举几个免费的例子: Microsoft WMI CIM Studio不擅长进行查询,但可以很好地查看类 来自www.ks-soft.net的WMI浏览器成为我使用最多的浏览器 您还需要在google上搜索WMI查询语言示例并

如何转换路径,如

\设备\硬盘卷3\Windows


进入其相应的虚拟路径?(如本例中的c:\Windows)

其中一种方法是使用WMI,例如,它还有一个演示,您可以使用它来获取代码样本

您可以在configuartiona类和构造查询中找到许多WMI资源管理器和资源管理器。举几个免费的例子:

  • Microsoft WMI CIM Studio不擅长进行查询,但可以很好地查看类
  • 来自www.ks-soft.net的WMI浏览器成为我使用最多的浏览器
您还需要在google上搜索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.
unitwmi\u助手;
接口
函数WMINetDiskName(const disk:string{'C:'-w/o slash}):string;
函数WMIPhysDiskName(const disk:string{'C:'-w/o slash}):string;
函数WMIGetVolumeName(const disk:string{'C:'-w/o slash}):string;
实施
使用magwmi、SysUtils、StrUtils、Windows、IOUtils;
函数WMIGetProp(constquery,param,resultProp:string):string;
开始

如果MagWmiGetOneQ(StringReplace(查询,'%s',参数,[]),resultProp,Result)我个人更喜欢原生方式:

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;
您必须用相应的驱动器号替换路径中的“\device\harddisk”部分

请注意,驱动器号取决于用户。 一些有用的链接:


+1用于解决方案,但(再次)WMI易于使用,功能强大,但速度较慢。并且不能保证正常工作(存储库损坏、启动缓慢等)。提示:在windows服务中使用WMI时,请确保您的服务依赖于WMI服务WMI看起来确实非常慢,调用WMIPhysDiskName大约需要230ms,而第一个答案中的另一个方法仅需0,1ms即可列出所有设备。请仔细查看。在这段代码中,每个调用都是自包含的:它创建TCP连接,然后创建COM对象树,然后获取单个属性并销毁所有这些。您可以在Delphi中搜索WMI示例-有更复杂的代码,可以在适当的地方重新使用这些对象。对于我的任务来说,一次查询所有驱动器号就足够了(实际上90%的可能性只有C:存在并且是HDD类型)。但是您可以重新使用对象。对于现代版本的Delphi,您可以通过返回
t字典
使结果更可用,这样调用者就不必再进行任何字符串解析来找到所需的条目。无论如何,这是非常快的。我稍微修改了代码,使用它来查找进程正在使用的文件的路径,迭代设备路径,直到找到用于转换的匹配项。在我的测试环境中,平均需要40微秒(0.04毫秒)。
\Device\HarddiskVolume2 = c:\
\Device\HarddiskVolume3 = d:\
\Device\IsoCdRom0 = e:\
\Device\CdRom0 = f:\
\Device\hgfs\;Z:0000000000084af9\vmware-host\Shared Folders = z:\