Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

C# File.Exists returns false, file does exist

Using VS 15, C# with .Net 4.5.2
The computer is on an AD network, with the ad name "AD".
This problem happens with AD normal-user rights, AD admin rights, and local admin rights. It doesn't matter what rights the program gets, the same problem occurs.

Our test file is "C:/windows/system32/conhost.exe".
The file above exists, it is very much existing. I can see it with explorer.

This is the file in explorer:
enter image description here

This is the file properties:
enter image description here

You can see that it is there, right?
The following cmd command checks if the file exists:

IF EXIST "C:\windows\system32\conhost.exe" (echo does exist) ELSE (echo doesnt exist) 

It returns "does exist" as promised.

The following C# code checks if the file exists:

FileInfo file = new FileInfo("C:/windows/system32/conhost.exe"); MessageBox.Show(file.Exists + ""); 

This returns "False".

This code also returns "False":

MessageBox.Show(File.Exists("C:/windows/system32/conhost.exe") + ""); 

This code also doesn't find it:

foreach (string file in Directory.GetFiles("C:/windows/system32/")) {     //conhost is NEVER mentioned, like it doesn't exist } 

This code also doesn't find it:

foreach (string file in Directory.EnumerateFiles("C:/windows/system32/")) {     //conhost is NEVER mentioned, like it doesn't exist } 

False, False, False:

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") + ""); 

What am I doing wrong?
Extra note: I copied conhost to C:\conhost.exe, and my program can find that without problem. My program also finds other files in system32, just not conhost and a few others. For example, it finds "connect.dll" which is in system32, so it's not the directory's read permission.
More extra notes: conhost.exe and connect.dll has the same security attributes (Security tab in the file properties).

like image 840
HoverCatz Avatar asked Mar 23 '17 13:03

HoverCatz


2 Answers

If you are using x64 system, you will have different content of the c:\Windows\System32 directory for x86 and x64 applications. Please be sure that you are using same architecture running batch file and your C# app.

like image 56
Uladzimir Palekh Avatar answered Sep 21 '22 12:09

Uladzimir Palekh


In the MSDN documentation for System.IO.File.Exists(path), it states:

If the caller does not have sufficient permissions to read the specified file, no exception is thrown and the method returns false regardless of the existence of path.

For this reason, we can safely assume that your application does not have read access to that specific file. Check the security settings and grant read access if not already done so.

Build your application (in release mode) and run as administrator.

like image 36
Nathangrad Avatar answered Sep 24 '22 12:09

Nathangrad