Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/314.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 结合ASP.NET外部的物理路径和虚拟路径_C#_File Io - Fatal编程技术网

C# 结合ASP.NET外部的物理路径和虚拟路径

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

我想在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

有没有更优雅的方法来完成这项任务?

可能会对您的任务有所帮助

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

以下是我的想法:

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。编辑您的答案并将答案授予您。:)