C# 结合ASP.NET外部的物理路径和虚拟路径
我想在windows服务中将虚拟文件路径转换为物理文件路径 我知道虚拟目录的物理路径是什么,所以我有以下功能可以使用,但感觉像是一个骗局:C# 结合ASP.NET外部的物理路径和虚拟路径,c#,file-io,C#,File Io,我想在windows服务中将虚拟文件路径转换为物理文件路径 我知道虚拟目录的物理路径是什么,所以我有以下功能可以使用,但感觉像是一个骗局: public static string GetPhysicalPathFromVirtual(string rootPath, string virtualPath) { int trailingSlash = virtualPath.IndexOf('/', 1) + 1; int length = virtualPath.Length
public static string GetPhysicalPathFromVirtual(string rootPath, string virtualPath)
{
int trailingSlash = virtualPath.IndexOf('/', 1) + 1;
int length = virtualPath.Length - trailingSlash;
string stripped = virtualPath.Substring(trailingSlash, length);
stripped = stripped.Replace(@"/", @"\");
return Path.Combine(rootPath, stripped);
}
下面是一个例子:
string test = FileHelper.GetPhysicalPathFromVirtual(@"T:\generateddocuments\output\", @"/virtualroot/folder/myfile.pdf");
返回:T:\generateddocuments\output\folder\myfile.pdf
有没有更优雅的方法来完成这项任务?可能会对您的任务有所帮助
请注意,在服务中使用相对路径可能会暴露出一个巨大的安全漏洞,因此在编写它们的代码时应该非常谨慎
以下是我的想法:
public static string GetPhysicalPathFromVirtual(string rootPath, string virtualPath)
{
const string mandatoryVirtualPrefix = "/virtualroot/";
if (!virtualPath.StartsWith(mandatoryVirtualPrefix))
throw new ArgumentOutOfRangeException(virtualPath, string.Format("Virtual '{0}' path must start with mandatory prefix '{1}'", virtualPath, mandatoryVirtualPrefix));
var relativePath = virtualPath.Substring(mandatoryVirtualPrefix.Length);
var rootUri = new Uri(rootPath, UriKind.Absolute);
var relativeUri = new Uri(relativePath, UriKind.Relative);
var absoluteUri = new Uri(rootUri, relativeUri);
if (!rootUri.IsBaseOf(absoluteUri))
throw new ArgumentOutOfRangeException(virtualPath, string.Format("Virtual path '{0}' can't be outside of root '{1}'", virtualPath, rootPath));
return absoluteUri.LocalPath;
}
可能对你的任务有帮助
请注意,在服务中使用相对路径可能会暴露出一个巨大的安全漏洞,因此在编写它们的代码时应该非常谨慎
以下是我的想法:
public static string GetPhysicalPathFromVirtual(string rootPath, string virtualPath)
{
const string mandatoryVirtualPrefix = "/virtualroot/";
if (!virtualPath.StartsWith(mandatoryVirtualPrefix))
throw new ArgumentOutOfRangeException(virtualPath, string.Format("Virtual '{0}' path must start with mandatory prefix '{1}'", virtualPath, mandatoryVirtualPrefix));
var relativePath = virtualPath.Substring(mandatoryVirtualPrefix.Length);
var rootUri = new Uri(rootPath, UriKind.Absolute);
var relativeUri = new Uri(relativePath, UriKind.Relative);
var absoluteUri = new Uri(rootUri, relativeUri);
if (!rootUri.IsBaseOf(absoluteUri))
throw new ArgumentOutOfRangeException(virtualPath, string.Format("Virtual path '{0}' can't be outside of root '{1}'", virtualPath, rootPath));
return absoluteUri.LocalPath;
}
问题是您需要知道虚拟根。在我的例子中,我没有,我也不想把它传递到方法中。这就是为什么我搜索第一个文件夹路径,然后删除它。也许Uri类会有所帮助。我来试试。如果你不想通过考试,你想从哪里拿到?它是运行exe的同一个文件夹吗?这是一个老问题,我刚刚复习过。您的代码不太正确,因为它没有按照我的问题返回本地文件路径。它需要返回absoluteUri.LocalPath。编辑您的答案并将答案授予您。:)问题是您需要知道虚拟根。在我的例子中,我没有,我也不想把它传递到方法中。这就是为什么我搜索第一个文件夹路径,然后删除它。也许Uri类会有所帮助。我来试试。如果你不想通过考试,你想从哪里拿到?它是运行exe的同一个文件夹吗?这是一个老问题,我刚刚复习过。您的代码不太正确,因为它没有按照我的问题返回本地文件路径。它需要返回absoluteUri.LocalPath。编辑您的答案并将答案授予您。:)