使用相对路径检查文件是否存在

时间:2012-10-17 19:29:44

标签: c#

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

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

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

9 个答案:

答案 0 :(得分:12)

那不是相对路径。您需要取消第一个/,否则它将被解释为root(即C:/ images ...)

答案 1 :(得分:7)

我猜你在asp.net应用程序中运行这段代码,这就是为什么你会弄错。

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

答案 2 :(得分:5)

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

答案 3 :(得分:2)

您只需要定义文件相对于

的内容
  • 您的应用程序主程序集?
  • 当前目录?
  • 申请数据目录?
  • 将其命名为......

在每种情况下,我建议您通过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通常是一个错误的决定。

答案 4 :(得分:1)

相对路径是相对。 在此API中,根据文档File.Exists

  

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

所以这里的一切都取决于执行此查询时 CurrentDirectoty 的内容。

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

在您的具体情况下,使用@"\images\Customswipe_a.png"就足够了。

答案 5 :(得分:1)

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

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

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

答案 6 :(得分:0)

路径相对于二进制文件的位置。对于visual studio项目,这将是%PROJECTDIR%/bin/(RELEASE||DEBUG)/

我要做的是将文件系统root置于配置文件中,并将其用于相对路径。

答案 7 :(得分:0)

在WinForms应用程序中,您可以使用

获取exe文件的目录
string directory =
    Path.GetDirectoryName(System.Windows.Forms.Application.ExecutablePath);

另一种解决方案使用Reflection

string directory =
    Path.GetDirectoryName(Assembly.GetEntryAssembly().Location);

答案 8 :(得分: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");