如何在 C# 中解析 Web/Windows 应用程序中的相对路径

问题描述 投票:0回答:3

我有一个将在桌面应用程序和 ASP.NET 网站中使用的程序集。

在任何一种情况下我都需要处理相对路径(本地文件,而不是 url)。

如何实现这个方法?

string ResolvePath(string path);

在 Web 环境下,我希望该方法的行为如下(其中

d:\wwwroot\mywebsite
是 IIS 指向的文件夹):

/folder/file.ext => d:\wwwroot\mywebsite\folder\file.ext
~/folder/file.ext => d:\wwwroot\mywebsite\folder\file.ext
d:\wwwroot\mywebsite\folder\file.ext => d:\wwwroot\mywebsite\folder\file.ext

对于桌面环境:(其中

c:\program files\myprogram\bin\
是.exe的路径)

/folder/file.ext => c:\program files\myprogram\bin\folder\file.ext
c:\program files\myprogram\bin\folder\file.ext => c:\program files\myprogram\bin\folder\file.ext

我不想根据它运行的状态注入不同的

IPathResolver

如何检测我所处的环境,然后在每种情况下我需要做什么来解析可能的相对路径?

c# relative-path path
3个回答
5
投票

我认为原来的问题没有得到解答。

假设您想要“..\..\data\something.dat”相对于“D:\myApp\source in\”中的可执行文件。使用

System.IO.Path.Combine(Environment.CurrentDirectory,relativePath);

将简单地返回“D:\myApp\source in..\..\data\something.dat”,这也可以通过简单地连接字符串轻松获得。组合不解析路径,它处理尾部反斜杠和其他琐事。他可能想跑:

System.IO.Path.GetFullPath("D:\myApp\source in..\..\data\something.dat");

要获取已解决的路径:“D:\myApp\data\something.dat”。


2
投票

应用程序运行时,网站二进制文件会被复制到临时文件夹中 - 因此您通常无法从执行程序集中获取相对路径。

这可能不是一个明智的做法 - 但我为解决这个问题所做的事情是这样的:

if (filepath.StartsWith("~"))
{
   filepath = HttpContext.Current.Server.MapPath(filepath);
}
else
{
  filepath = System.IO.Path.Combine(Environment.CurrentDirectory, filepath);
}

这是因为在网络版本上 - 相对路径前面有一个 ~ - 所以我可以判断它是来自 web.config 还是 App.config。


1
投票

正如约翰的评论中提到的,相对于什么?您可以使用

System.IO.Path.Combine
方法将基本路径与相对路径组合,例如:

 System.IO.Path.Combine(Environment.CurrentDirectory, relativePath);

您可以将上面一行中的

Environment.CurrentDirectory
替换为您想要的任何基本路径。

您可以将基本路径存储在配置文件中。

© www.soinside.com 2019 - 2024. All rights reserved.