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

时间:2014-02-26 13:06:15

标签: c# .net virtualization

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

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

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

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

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
};

谢谢!

6 个答案:

答案 0 :(得分:22)

这是唯一的区别,它更多地与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的值在您第一次使用时被缓存。

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

答案 1 :(得分:13)

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

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

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

答案 2 :(得分:1)

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

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

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

答案 3 :(得分:1)

完整路径(目录名+文件名)很长时,func_num_args()File.Exists()之间的行为差​​异:

new FileInfo().Exists

答案 4 :(得分:1)

我刚刚找到了这个线程并想更新它,因为我遇到了 FileInfo 与 File.Exists 的问题。

假设我们为当前不存在于 UNC 共享中的文件创建 fileinfo 对象。

im2

此时,该文件不存在,但如果我使用其他工具(其他代码或我的应用程序外部)创建它,然后执行此操作...

bool fileInfo  = new FileInfo(@"\\uncshare\name\filename.txt");

结果是错误的,它不存在,即使它存在并且文件信息被刷新。

要获得正确的结果需要..

fileInfo.Refresh();
bool exists = fileInfo.Exists;

希望能帮助他人。

答案 5 :(得分:0)

我使用下面的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();

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