【问题标题】:C# File.Exists returns false, file does existC# File.Exists 返回 false,文件确实存在
【发布时间】: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()。或者使用字符串插值......无论如何。 + "" 看起来不太对。

标签: c# file file-exists


【解决方案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; 
       }
    

    【讨论】:

      猜你喜欢
      • 2011-07-23
      • 2010-10-29
      • 1970-01-01
      • 2012-10-22
      • 2019-12-30
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多