File.Exists(“”)和FileInfo之间存在什么区别

我在\ ProgramFiles(x86)\ MyAppFolder中有一个* .exe文件。

在x86应用程序中,我检查文件是否存在(64位系统)。 简单:

bool fileExists = File.Exists(@"\ProgramFiles(x86)\MyAppFolder\Manager.exe"); 

结果是:“fileExists == false”(文件确实存在)。 据我所知,这是虚拟化。 这里描述的问题很好。 但下一个代码:

 bool fileExists = new FileInfo("\\Path").Exists; 

“fileExists == true”

为什么在第一和第二种情况下结果不同?

 var controller = new ServiceController(Product.ServiceName); _manager.Enabled = controller.Status == ServiceControllerStatus.Running; var info = new DirectoryInfo(Assembly.GetExecutingAssembly().Location); var s = File.Exists(@"D:\TFS\GL_SOURCES\Teklynx_LPM\Dev\Server\Debug\Manager.exe"); string pathToManager = string.Empty; if (info.Parent != null) { var pathToModule = info.Parent.FullName; pathToManager = Path.Combine(pathToModule,"Manager.exe").Replace(" ",string.Empty); } 

//效果很好

 var fileInfo = new FileInfo(pathToManager); var managerSeparator = new ToolStripSeparator() { Visible = _manager.Visible = fileInfo.Exists // true }; 

//不起作用

 var managerSeparator = new ToolStripSeparator() { Visible = _manager.Visible = File.Exists(pathToManager ) // false }; 

谢谢!

没有区别,这些方法在.NET Framework中使用完全相同的内部帮助器方法。 使用反编译器或Reference Source源代码可以看到的东西,辅助方法名称是File.FillAttributeInfo()。

在.NET Framework中具有这样的重复是非常不寻常的,并不是一件好事,因为它有多种方法来完成同样的事情。 然而,File类是特殊的,它是在.NET 1.0发布之前进行的可用性研究之后添加的。 测试对象只需要使用基本的BCL类,如FileStream和FileInfo,否则只有MSDN文档可用。 测试结果不是很好,File类被添加以帮助程序员陷入成功的陷阱,编写非常基本的文件操作代码。 像File.Exists()和File.ReadAllLines()。

所以它与类没有任何关系,你只是错误地使用它们。 就像没有实际使用相同的路径。 在正斜杠上很容易,在Windows中发生向后斜线的映射,并且在其他代码中不一致地实现。 使用//肯定不会做你希望它做的事情。

这是唯一的区别,它更多地与FileInfo的本质有关:

 FileInfo fileInfo = new FileInfo("myFile.txt"); // non-existent file Console.WriteLine(fileInfo.Exists); // false File.Create("myFile.txt"); Console.WriteLine(File.Exists("myFile.txt")); // true Console.WriteLine(fileInfo.Exists); // false 

因此,您可以看到fileInfo.Exists的值在您第一次使用时被缓存。

除此之外,他们在幕后做同样的事情。

在第一种情况下,文件路径不正确,您需要"Program Files (x86)"空格。

其次,Path.Combine将返回一个Directory路径,所以你最终会得到像"C:\Program Files (x86)\MyAppFolder\Manager.exe\"这样的东西,所以这是一个坏主意。

两种方法的工作方式相同,因此请确保检查路径是否正确。

File.Exists()new FileInfo().Exists之间的区别new FileInfo().Exists当完整路径(目录名+文件名)很长时,它的行为new FileInfo().Exists

 var f = @"C:\Program Files (x86)\MyAppFolder\many_subfolders\manager.exe"; //f.length > 260 characters bool fileExists = File.Exists(f); //return false, even if the file exists // Throw exception: "The specified path, file name, or both are too long. The fully qualified file name must be less than 260 characters, and the directory name must be less than 248 characters." bool fileInfoExists = new FileInfo(f).Exists; 

我使用下面的Linqpad脚本复制了你的场景

 var f = @"C:\Program Files (x86)\MyAppFolder\manager.exe"; bool fileExists = File.Exists(f); bool fileInfoExists = new FileInfo(f).Exists; fileExists.Dump(); fileInfoExists.Dump(); 

当文件存在时和不存在的时候都要这样做,并且每次都产生相同的输出。 也许在你的系统上尝试这个,看看你是否仍然看到差异。