C# File.Exists(";)和FileInfo Exists之间的区别是什么

C# File.Exists(";)和FileInfo Exists之间的区别是什么,c#,.net,virtualization,C#,.net,Virtualization,我在\ProgramFiles(x86)\MyAppFolder中有一个*.exe文件 在x86应用程序中,我检查文件是否存在(64位系统)。 简单: 结果是: “fileExists==false”(文件确实存在)。据我所知,这是虚拟化。这个问题说明它还可以。 但下一个代码: bool fileExists = new FileInfo("\\Path").Exists; “fileExists==true” 为什么第一和第二种情况的结果不同 var controller = new Ser

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

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

结果是: “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中使用完全相同的内部帮助器方法。您可以在反编译器或参考源代码中看到,助手方法名为File.FillAttributeInfo()

在.NET框架中有这样的复制是非常不寻常的,有多种方法来完成同样的事情并不是一件好事。然而,File类是特殊的,它是在.NET1.0发布后添加的。受试者只需使用基本的BCL类,如FileStream和FileInfo,否则只有MSDN文档可用。测试结果不是很好,添加了File类以帮助程序员成功编写非常基本的文件操作代码。例如File.Exists()和File.ReadAllLines()


所以这和类没有任何关系,你只是用错了它们。就像不使用相同的路径一样。不要轻易使用正向斜杠,到反向斜杠的映射发生在Windows内部,并且在其他代码中实现不一致。使用//显然不能达到您希望的效果。

在第一种情况下,文件路径不正确,您需要在
“程序文件(x86)”中使用空格。

其次,Path.Combine将返回一个目录路径,因此您将得到类似于
“C:\Program Files(x86)\MyAppFolder\Manager.exe\”的内容
所以这是个坏主意


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

这是唯一的区别,它与
文件信息的性质有关:

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的值在您第一次使用它时被缓存


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

当完整路径(目录名+文件名)较长时,
File.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;

我刚刚找到了这个线程,并想更新它,因为我在FileInfo vs File.Exists上遇到了一个问题

让我们看一个场景,我们为一个UNC共享上当前不存在的文件创建一个fileinfo对象

bool fileInfo  = new FileInfo(@"\\uncshare\name\filename.txt");
此时,该文件不存在,但如果我使用其他工具(其他代码或在我的应用程序之外)创建它,然后执行此操作

fileInfo.Refresh();
bool exists = fileInfo.Exists;
结果为false,它不存在,即使它存在并且文件信息已刷新

要得到正确的结果,需要

bool exists = File.Exists(f);

希望对其他人有所帮助。

对于windows,文件系统路径使用
\\而不是
/,并且。。。您的示例调用使用了不同的路径…?我可以想象,使用FileInfo.Exist over File.Exists的唯一原因是您以后是否要使用FileInfo对象。您是否使用如上所述的“ProgramFiles(x86)”呢?因为这个文件夹名包含空格“ProgramFiles(x86)”,哦,这是我的错误。我使用了Assembly.getExecutionGassembly().Location,然后组合路径,如(path.Combine(pathToModule,“Manager.exe”))。所以斜杠应该是正确的。您是否尝试过:bool fileExists=File.Exists(@“C:\Program Files(x86)\MyAppFolder\Manager.exe”)?看起来我快要发疯了,但是现在我不能在VS重新启动后重现这个问题(相同的代码)。这个问题在我们的软件中被发现是一个bug,实际上,当你第一次启动应用程序时,一切正常,但在操作系统重新启动后“找不到文件!”会有一个很难重现的方法。我可以在软件上稳定地重现这一点。无论如何,我同意-File.Exists()和.Exist-prop。都是同样的事情,问题在别处。谢谢这实际上是行为上的一个关键差异!从表面上看,我很确定大多数人都会根据文件的当前状态,而不是该文件的某些缓存状态来期望失败或成功。@ouflak是的,我从未见过你在“第二”段中描述的问题。您能否举例说明在最终路径的末尾没有明确的“\”符号。合并参数?
fileInfo.Refresh();
bool exists = fileInfo.Exists;
bool exists = File.Exists(f);