3

我有一个将在桌面应用程序和 asp.net 网站中使用的组件。

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

我怎样才能实现这个方法?

string ResolvePath(string path);

在 web envronment 下,我希望该方法的行为如下(d:\wwwroot\mywebsiteiis 指向的文件夹在哪里):

/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根据其运行的状态注入不同的。

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

谢谢

4

3 回答 3

5

我认为最初的问题没有得到回答。

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

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

将简单地返回 "D:\myApp\source\bin..\..\data\something.dat" 这也很容易通过简单地连接字符串来获得。组合不解析路径,它处理尾随反斜杠和其他琐事。他可能想跑:

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

要获得解析的路径:“D:\myApp\data\something.dat”。

于 2011-07-08T18:07:27.357 回答
2

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

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

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

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

于 2012-02-27T22:16:05.777 回答
1

正如约翰的评论中提到的,相对于什么?您可以使用System.IO.Path.Combine方法将基本路径与相对路径结合起来,例如:

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

您可以用Environment.CurrentDirectory您想要的任何基本路径替换上面的行。

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

于 2009-06-22T16:37:28.870 回答