Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

What is difference between File.Exists("") and FileInfo exists

I have an *.exe file in \ProgramFiles(x86)\MyAppFolder.

In x86 application I check if the file exists (64 bit system). simple:

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

The result is: "fileExists == false" (the file is really there). It's Virtualization as I understand.That issue described here Its ok. But next code:

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

"fileExists == true"

Why is the result different in 1st and 2nd cases?

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

//works good

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

//Does not work

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

Thanks!

like image 597
Baranovskiy Dmitry Avatar asked Feb 26 '14 13:02

Baranovskiy Dmitry


People also ask

What is the difference between FileInfo and file class?

Apart from these, other minor differences are that File is a static type class whereas FileInfo is an instance type class. Therefore to access the members of FileInfo class you need to create an instance whereas in File class you can directly access its members without the need to create an instance.

What is file exist?

If the file exists, the exists() function returns True . Otherwise, it returns False . If the file is in the same folder as the program, the path_to_file is just simply the file name. However, it's not the case, you need to pass the full file path of the file.

Does file exists lock the file?

No, File. Exist doesn't lock the file.


3 Answers

This is about the only difference and it has more to do with the nature of 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

So as you can see the value of fileInfo.Exists is cached the first time you use it.

Other than that, they do the same thing behind the scenes.

like image 121
David Sherret Avatar answered Oct 08 '22 23:10

David Sherret


There is no difference, these methods use the exact same internal helper method inside the .NET Framework. Something you can see with a decompiler or the Reference Source source code, the helper method name is File.FillAttributeInfo().

Having duplication like this in the .NET Framework is pretty unusual, not exactly a Good Thing to have more than one way to accomplish the same thing. The File class is however special, it got added after a usability study conducted when .NET 1.0 shipped. The test subjects just had the basic BCL classes to work with, like FileStream and FileInfo, and otherwise only had MSDN documentation available. The test results were not very good, the File class got added to help programmers fall in the pit of success writing very basic file manipulation code. Like File.Exists() and File.ReadAllLines().

So it doesn't have anything to do with the classes, you are just using them wrong. Like not actually using the same path. Do go easy on the forward slashes, the mapping to backward slashes happens inside Windows and is inconsistently implemented in other code. Using // certainly doesn't do what you hope it does.

like image 17
Hans Passant Avatar answered Oct 08 '22 23:10

Hans Passant


I've replicated your scenario using the below Linqpad script

var f = @"C:\Program Files (x86)\MyAppFolder\manager.exe";

bool fileExists = File.Exists(f);
bool fileInfoExists = new FileInfo(f).Exists;

fileExists.Dump();
fileInfoExists.Dump();

Ran this both when the file existed and when it did not and both produced the same output each time. Maybe try this on your system and see if you still see differences.

like image 1
hermiod Avatar answered Oct 08 '22 23:10

hermiod