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.2 和 Target 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