我有一个将在桌面应用程序和 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
。
如何检测我所处的环境,然后在每种情况下我需要做什么来解析可能的相对路径?
我认为原来的问题没有得到解答。
假设您想要“..\..\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”。
应用程序运行时,网站二进制文件会被复制到临时文件夹中 - 因此您通常无法从执行程序集中获取相对路径。
这可能不是一个明智的做法 - 但我为解决这个问题所做的事情是这样的:
if (filepath.StartsWith("~"))
{
filepath = HttpContext.Current.Server.MapPath(filepath);
}
else
{
filepath = System.IO.Path.Combine(Environment.CurrentDirectory, filepath);
}
这是因为在网络版本上 - 相对路径前面有一个 ~ - 所以我可以判断它是来自 web.config 还是 App.config。
正如约翰的评论中提到的,相对于什么?您可以使用
System.IO.Path.Combine
方法将基本路径与相对路径组合,例如:
System.IO.Path.Combine(Environment.CurrentDirectory, relativePath);
您可以将上面一行中的
Environment.CurrentDirectory
替换为您想要的任何基本路径。
您可以将基本路径存储在配置文件中。