26

使用相对路径检查文件是否存在的最佳方法是什么。

我使用了以下方法,但尽管文件存在,但它返回 false。

 bool a = File.Exists("/images/Customswipe_a.png");
4

9 回答 9

13

那不是相对路径。您需要省略第一个,/否则它将被解释为已植根(即 C:/images...)

于 2012-10-17T19:32:36.087 回答
9

我猜您是在 asp.net 应用程序中运行此代码,这就是您得到错误的原因。

在 asp.net 中,您应该使用Server.MapPath("/images/Customswipe_a.png")获取“正确”路径(相对于 Web 应用程序根目录)。否则,您将获得网络服务器可执行文件的本地路径(IIS/WEBDAV/..name 任何其他)。

于 2012-10-17T19:43:32.607 回答
6

相对路径是相对于当前工作目录的。它可能不是应用程序目录。调用GetCurrentDirectory()来检查您正在测试的实际路径。

于 2012-10-17T19:33:19.207 回答
4

你只需要定义你的文件是相对的

  • 您的应用程序主程序集?
  • 当前目录?
  • 应用数据目录?
  • 给它命名...

在每种情况下,我建议您通过Path.Combine方法将其转换为绝对路径:

public static readonly string AppRoot = Path.GetDirectoryName(Assembly.GetEntryAssembly().Location);

...

//calling with a '/' heading makes the path absolute so I removed it
var fullPath = Path.Combine(AppRoot, "images/Customswipe_a.png");
var exists = File.Exists(fullPath);

这样您就可以保证您正在寻找的地方。甚至打开/保存文件对话框也可能会更改您的当前目录。因此,没有完整路径的调用File.Exists通常是一个错误的决定。

于 2012-10-17T21:15:16.657 回答
2

您可以使用 System.IO.DirectoryInfo 测试此路径:

DirectoryInfo info = new DirectoryInfo("/images/Customswipe_a.png");
string absoluteFullPath = info.FullName;

正如 Mike Park 正确回答的那样,这条路径很可能是(即 C:/images...)

于 2018-08-30T14:11:29.717 回答
1

相对路径,是对于某物的。在此 API 中,它将根据文档File.Exists

相对路径信息被解释为相对于当前工作目录。

所以这里的一切都取决于执行此查询时CurrentDirectoty是什么。

另外,您的路径不是有效的桌面路径(我假设您从一些网络文件或知识中选择它)。要了解指定路径是否包含无效字符,请使用GetInvalidCharacters函数。

在您的特定情况下,使用@"\images\Customswipe_a.png".

于 2012-10-17T19:34:51.703 回答
0

在 WinForms 应用程序中,您可以使用以下命令获取 exe 文件的目录

string directory =
    Path.GetDirectoryName(System.Windows.Forms.Application.ExecutablePath);

另一种解决方案使用反射

string directory =
    Path.GetDirectoryName(Assembly.GetEntryAssembly().Location);
于 2012-10-17T19:46:06.120 回答
0

该路径是相对于您的二进制文件的位置。对于视觉工作室项目,这将是%PROJECTDIR%/bin/(RELEASE||DEBUG)/

我要做的是将文件系统根目录放在配置文件中,并将其用作您的相对路径。

于 2012-10-17T19:33:14.810 回答
0

.NET Core 3.1开始,这有效:

使用依赖注入来包含服务IWebHostEnvironment

private IWebHostEnvironment Env;

public MyController (IWebHostEnvironment env){
    Env = env;
}

然后使用它来获取应用程序根目录的路径Env.ContentRootPath

并将其结合起来:

var file = System.IO.Path.Combine(Env.ContentRootPath, "images", "some-file.png");
于 2020-03-26T15:59:10.100 回答