繁体   English   中英

在ASP.NET外部结合物理路径和虚拟路径

[英]Combine physical path and virtual path outside ASP.NET

我想在Windows服务中将虚拟文件路径转换为物理文件路径。

我知道虚拟目录的物理路径是什么,所以我有以下功能可以正常工作,但感觉像是在摸索:

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

有没有更优雅的方法可以做到这一点?

Uri类可能对您的任务有所帮助。

请注意,在服务中使用相对路径可能会暴露出巨大的安全漏洞,因此在编写代码时应非常谨慎。

这是我想出的:

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;
}

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM