C# File.Exists 返回 false,文件确实存在

Posted

技术标签:

【中文标题】C# File.Exists 返回 false,文件确实存在【英文标题】:C# File.Exists returns false, file does exist 【发布时间】:2017-08-16 01:54:45 【问题描述】:

在 .Net 4.5.2 中使用 VS 15、C# 计算机位于 AD 网络上,广告名称为“AD”。 AD 普通用户权限、AD 管理员权限和本地管理员权限会出现此问题。不管程序获得什么权利,都会出现同样的问题。

我们的测试文件是“C:/windows/system32/conhost.exe”。 上面的文件存在,它非常存在。我可以用资源管理器看到它。

这是资源管理器中的文件:

这是文件属性:

你可以看到它在那里,对吧? 以下 cmd 命令检查文件是否存在:

IF EXIST "C:\windows\system32\conhost.exe" (echo does exist) ELSE (echo doesnt exist)

它按照承诺返回“确实存在”。

以下 C# 代码检查文件是否存在:

FileInfo file = new FileInfo("C:/windows/system32/conhost.exe");
MessageBox.Show(file.Exists + "");

这将返回“False”。

此代码还返回“False”:

MessageBox.Show(File.Exists("C:/windows/system32/conhost.exe") + "");

这段代码也找不到:

foreach (string file in Directory.GetFiles("C:/windows/system32/"))

    //conhost is NEVER mentioned, like it doesn't exist

这段代码也找不到:

foreach (string file in Directory.EnumerateFiles("C:/windows/system32/"))

    //conhost is NEVER mentioned, like it doesn't exist

假,假,假:

MessageBox.Show(File.Exists("C:/windows/system32/conhost.exe") + "");
MessageBox.Show(File.Exists("C:\\windows\\system32\\conhost.exe") + "");
MessageBox.Show(File.Exists(@"C:\windows\system32\conhost.exe") + "");

我做错了什么? 额外说明:我将 conhost 复制到 C:\conhost.exe,我的程序可以毫无问题地找到它。我的程序还在 system32 中找到了其他文件,只是没有找到 conhost 和其他一些文件。比如找到system32中的“connect.dll”,所以不是目录的读权限。 更多额外说明:conhost.exe 和 connect.dll 具有相同的安全属性(文件属性中的安全选项卡)。

【问题讨论】:

你试过把 / 改成 \ 吗? 试试File.Exists(@"C:\windows\system32\conhost.exe") 64 位应用程序和重定向可能... 问题是您提出问题的地方,而不是您发布答案的地方。如果您想发布您自己的答案,以及其他人提供的答案,请将其发布为作为答案。如果现有答案充分回答了问题,那么当然没有必要这样做。 不相关,但所有+ "" 的东西都用完了吗?摆脱那些无用的垃圾。如果你打算做.ToString(),那么就去.ToString()。或者使用字符串插值......无论如何。 + "" 看起来不太对。 【参考方案1】:

如果您使用的是 x64 系统,对于 x86 和 x64 应用程序,c:\Windows\System32 目录的内容将有所不同。请确保您使用相同的架构运行批处理文件和您的 C# 应用程序。

【讨论】:

这是我唯一没有尝试过的。我现在就这样做并更新我的问题,也许将其设置为已解决。 这可能有问题,但可能有其他问题,因为我在 32 位和 64 位模式下都尝试过,非管理员,它两次都找到了文件,但是然后我的“32 位”模式也是“anyCPU”,所以这可能是我的问题。我会更明确地重新测试它。编辑:是的,将 .NET 项目强制为 32 位确实会复制问题。默认是 AnyCPU,所以我想知道 OP 在做什么而不是那样。 可能值得一提的是为什么会这样。我相信这与File System Redirector 谢谢,@UladzimirPalekh!这也解释了,对我来说,为什么在将WorkingDirectory 设置为%SYSTEMROOT%\system32 后我不能做Process.Start("arp");,我必须这样做,因为我在做模拟。在我的帐户下,它运行良好。我发现这是因为arp 只是一个 32 位应用程序,所以它有正确的上下文 - 因为我必须通过模拟来指导它,但它没有。 :( 我在特定目录中有一个文件。 File.Exists(@"absolute/path/to/the/file") 返回false。我使用 Target Framework : netcoreapp2.2Target Runtime : win-x86 发布了该项目。甚至比File.Exists(@"absolute/path/to/the/file") 返回false。我希望 C# 代码能够读取文件并执行它。【参考方案2】:

在 System.IO.File.Exists(path) 的 MSDN 文档中,它指出:

如果调用者这样做了 没有足够的权限来读取指定的文件,没有 抛出异常并且该方法返回 false 而不管 路径的存在。

因此,我们可以放心地假设您的应用程序没有对该特定文件的读取权限。检查安全设置并授予读取权限(如果尚未这样做)。 构建您的应用程序(在发布模式下)并以管理员身份运行。

【讨论】:

我指定我在我的问题中尝试了 2 种类型的管理员权限。 示例文件是内置系统文件,位于 Windows 文件夹中。每个用户至少都有读取权限,否则 Windows 本身就会出现问题。对于其他文件,需要考虑权限。 我的王国在 C# 中单独使用 .exists().canRead()。该方法应称为existsAndCanRead()【参考方案3】:

这是 64 位操作系统的问题...这里有一个解决方法,

转到项目的属性 > 点击构建选项卡 > 取消勾选首选 32 位

之后,它应该可以在 64 位操作系统上正常工作。

【讨论】:

【参考方案4】:

这确实提供了 - 在大多数情况下 - 预期的结果。

FileInfo f = new FileInfo(@"C:\Program Files\Microsoft Office\root\Office16\MSACCESS.EXE");
if (f.Exists) 
   
    ... do something; 
   

【讨论】:

以上是关于C# File.Exists 返回 false,文件确实存在的主要内容,如果未能解决你的问题,请参考以下文章

C# File.Exists判断系统文件 警惕32位和64位的差异

为啥'File.exists'返回true,即使NIO'Files'类中的'Files.exists'返回false

检查文件是不是存在? file.exists() 总是返回 false

File.Exists() 在 IIS 上总是返回 false

File.exists() 为现有文件返回 false

File.Exists 从网络共享返回 false