[英]How to get the physical path of a file that is in a virtual drive from C#
出现此问题的方式如下:
我用这样的蝙蝠在DOS中用一个称为subst的命令创建一个虚拟驱动器或“虚拟驱动器号”:
@echo off
cd \
subst J: /D
subst J: C:\Virtual_Disk\Unit_J
在Windows单元列表中,我看到创建的单元,在其中放置了一些文件和可执行文件。 我目前正在用c#开发一个程序,在其中调用虚拟路径中的可执行文件的路径,突然,抛出一个异常,指示即使该可执行文件在该位置也找不到可执行文件的路径,我查看可执行文件的属性。 可执行文件,并且在字段中的位置指示该可执行文件的虚拟路径,而不是物理路径。 如果不清楚,我将举一个例子:
(1)可执行文件的虚拟路径
J:\Program\executable.exe
(2)可执行文件所在的物理路径
C:\Virtual_Disks\Unit_J\Program\executable.exe
C#捕获可执行文件的虚拟路径(1),但不捕获其实际位置(2)。
不多,我感谢提供的帮助。
从这里可以正常工作:
[DllImport("kernel32.dll")]
private static extern uint QueryDosDevice(string lpDeviceName, StringBuilder lpTargetPath, int ucchMax);
private static string GetPhysicalPath(string path)
{
if (string.IsNullOrEmpty(path))
{
throw new ArgumentNullException("path");
}
// Get the drive letter
var pathRoot = Path.GetPathRoot(path);
if (string.IsNullOrEmpty(pathRoot))
{
throw new ArgumentNullException("path");
}
var substPrefix = @"\??\";
var lpDeviceName = pathRoot.Replace(@"\", string.Empty);
var lpTargetPath = new StringBuilder(260);
if (QueryDosDevice(lpDeviceName, lpTargetPath, lpTargetPath.Capacity) != 0)
{
string result;
// If drive is substed, the result will be in the format of "\??\C:\RealPath\".
if (lpTargetPath.ToString().StartsWith(substPrefix))
{
// Strip the \??\ prefix.
var root = lpTargetPath.ToString().Remove(0, substPrefix.Length);
result = Path.Combine(root, path.Replace(Path.GetPathRoot(path), string.Empty));
}
else
{
// if not SUBSTed, just assume it's not mapped.
result = path;
}
return result;
}
else
{
return null;
}
}
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.