C# File.exists returns false - c#

I have a program that opens a database, the path to that database is this:
private static string strDefaultDB2 = #"C:\Users\" + Environment.UserName + #"\OneDrive\TIME FILE\MyName\TimeFile.accdb";
All computers I have tried this one were able to access it fine except one, it also has access to OneDrive but when I run the code the file doesn't exist... If I enter the path generated by the code which is something like this:
C:\Users\UserName\OneDrive\TIME FILE\MyName\TimeFile.accdb
In explorer, it opens up the database right away. I'm not sure why it can't find the database on this one machine... I also tried running it as admin but that didn't change anything
This is the code that executes:
if (!System.IO.File.Exists(doesFileExist))
{
Polaris.Polaris.log("The Path " + doesFileExist + " Does Not Exist!");
runWindowDB();
}
If I try to do a rename on the file it throws an exception: "Could not find file [path]"
And If I try to open the database: "[path] is not a valid path"
I don't get it because this path has whitespace on every pc and the only thing that changes is the username. Explorer opens the file so the path is correct.
Any ideas?
Thanks

Do you get an exception? Can you read/write this file?
You have a whitespace in the string I don't think that is good anyway.
From the official documentation link:
If path describes a directory, this method returns false. Trailing
spaces are removed from the path parameter before determining if the
file exists.
The Exists method returns false if any error occurs while trying to
determine if the specified file exists. This can occur in situations
that raise exceptions such as passing a file name with invalid
characters or too many characters, a failing or missing disk, or if
the caller does not have permission to read the file.

Hard code another users username that you know works, try it from this machine, msdn mentions it will return false if there are invalid characters in the string or if the path is determined to be a folder, there might be some odd encoding going on or virus scanner intercepting the io. If that fails try getting the user to log onto another box that works and if the file is then recognized it must the environment on that users original box.

Related

My C# code can't see my directory in my C drive...even though the directory exists

My directory is at C:\Testing\Event Log 123
The 123 portion is a timestamp. My code runs and generates a timestamped directory in C:\Testing upon completion. I have this piece of code that checks if that directory exists:
string dirToCopy = #"C:\Testing\Event Log " + timestamp;
if (System.IO.Directory.Exists(dirToCopy))
{
APILog.AddMessage("Event System log directory found.");
}
else
{
APILog.AddMessage("Event System log directory not found.");
}
The directory does exist at that location, but the else statement's log message is what gets displayed. I don't think there's an issue with permissions, as I'd be getting a security exception if that was the case...so why can't my code see the directory that I can see with my own eyeballs right now? I tried outputting dirToCopy to make sure that it matches the directory's actual name. They match, so I'm surprised that my code doesn't see it.
Edit for more info: My code runs on a client PC. It generates the directory and pastes it into the main PC's C:\Testing directory. The main PC's C:\Testing directory is a sort of shared directory that the client can also access. Does this matter, though? C:\Testing is on the main PC, and I'm running the code on the main PC.
So the directory You're looking for is "C:\Testing\Event Log2016.01.26"
or maybe "C:\Testing\Event Log\2016.01.26"
the point being - the slash at the end ? isn't it missing ?
you could also consider using Path.Combine() for building the path string
This is what MSDN says
If you do not have at a minimum read-only permission to the directory, the Exists method will return false.
https://msdn.microsoft.com/en-us/library/system.io.directory.exists.aspx
So it does not throws security exception....so do check once if you have read permission on that directory
Update
If it is shared directory then your path should look like this
string dirToCopy = #"\\MainPC\Testing\Event Log 123" (Assuming testing folder is shared)
If it is UNC path then your path should like this
string dirToCopy = #"\\MainPC\C$\Testing\Event Log 123"

Exception: "Access to the path ... is denied"

I'm working on a program in C#, a part of which is to create a directory in the Application.StartupPath folder and then write a text file inside it using System.IO.File.WriteAllText(). My issue is that my program crashes, throwing an UnauthorizedAccessException and telling me that "Access to the path is denied", which is, well, odd, considering that it crashes regardless of the directory from which I am running the program, whether it be running from my cloud folders, Desktop, My Documents, etc, and even despite running it as Administrator in any of those directories.
The path from which I'm debugging it is C:\Users\Jeff\Google Drive\Documents\Visual Studio 2013\Projects\Palobo\Palobo\bin\Debug. It is using System.IO;, and the code I'm using includes:
Directory.CreateDirectory(Application.StartupPath);
File.WriteAllText(Application.StartupPath, "Password=" + x);
where x is some String data entered by the user.
The error I get is:
Access to the path 'C:\Users\Jeff\Google Drive\Documents\Visual Studio 2013\Projects\Palobo\mzdon29 is denied.
(mzdon29 being an encrypted result of jwalk96).
Does anyone have any ideas as to why I'm encountering this problem? Thanks!
Application.StartupPath is a folder (where your application is started from). Try to specify an exact filename inside that folder:
File.WriteAllText(Application.StartupPath + "\\MyFile.txt", "Password=" + x);
Let's look at this code:
Directory.CreateDirectory(Application.StartupPath);
File.WriteAllText(Application.StartupPath, "Password=" + x);
You're trying to create a directory that already exists, and then you're trying use the directory as a file name! You need to add something to end of the path, so that you're working with a new folder and file.
Also, using the StartupPath for this is poor practice in the first place. You can create a shortcut that sets the startup path to anywhere. But specifically, it's common for the default StartupPath to be somewhere under the Program Files folder. Items under this folder are read only to standard users by default. Instead, you should look at using the Application Data folder, like so:
Environment.GetFolderPath(Environment.SpecialFolder.ApplicationData)
Finally, this sure looks like it's saving a password in plain-text. Do I really need to go over how bad that is? You shouldn't even save passwords encrypted (hashing is different than encryption), and this is one of those things that's so important you shouldn't even do it for testing/learning/proof of concept code.

"Could not find a part of the path" C:\Users\username\abc\abc.exe.config

configFilePath = #"C:\Users\" + userName + #"\abc\abc.exe.config";
if(File.Exists(configFilePath))
{
StreamReader fileReader = new StreamReader(configFilePath);
}
The above line throws "could not find part of the path" exception. This error occurs in a particular machine. In all other machines it works fine. And even in that machine , the same code worked before. No changes made in the machine. I have read all the forums where this issue had been discussed. But couldn't able to figure out why this happens in that machine alone and that too now. Having permissions to access the folder and file.
First, use Path.Combine() rather than string concatenation for paths. However, the user name may contain a character that is invalid in a path, such as a single quote, so it may have been escaped. Assuming "C:\Users" is the users' directory and not your own folder structure, a better solution is to lookup the user profile folder for that user using the Environment.GetFolderPath() method with the UserProfile value from the SpecialFolders enumeration.
Something else to think about is permissions on the file/folder. I've run into issues where all of a sudden the folder security gets out of whack because of a windows update.

Why is access to the path denied?

I am having a problem where I am trying to delete my file but I get an exception.
if (result == "Success")
{
if (FileUpload.HasFile)
{
try
{
File.Delete(Request.PhysicalApplicationPath + app_settings.login_images + txtUploadStatus.Text);
string filename = Path.GetFileName(btnFileUpload.FileName);
btnFileUpload.SaveAs(Request.PhysicalApplicationPath + app_settings.login_images + filename);
}
catch (Exception ex)
{
Message(ex.ToString());
}
}
}
Also I should note that the folder I am trying to delete from has full control to network services.
The full exception message is:
System.UnauthorizedAccessException: Access to the path 'C:\Users\gowdyn\Documents\Visual Studio 2008\Projects\hybrid\hybrid\temp_loginimages\enviromental.jpg' is denied. at System.IO.__Error.WinIOError(Int32 errorCode, String maybeFullPath) at System.IO.File.Delete(String path) at hybrid.User_Controls.Imgloader_Add_Edit_Tbl.btnUpdate_Click(Object sender, EventArgs e) in C:\Users\gowdyn\Documents\Visual Studio 2008\Projects\hybrid\hybrid\User_Controls\Imgloader_Add_Edit_Tbl.ascx.cs:line 242
Any ideas?
According to File.Delete Method...
An UnauthorizedAccessException means one of 4 things:
The caller does not have the required permission.
The file is an executable file that is in use.
Path is a directory.
Path specified a read-only file.
I also had the problem, hence me stumbling on this post. I added the following line of code before and after a Copy / Delete.
Delete
File.SetAttributes(file, FileAttributes.Normal);
File.Delete(file);
Copy
File.Copy(file, dest, true);
File.SetAttributes(dest, FileAttributes.Normal);
This is an old issue, but I ran into it while searching. Turns out that I was missing the actual filename component in the save path for SaveAs...
string uploadPath = Server.MapPath("~/uploads");
file.SaveAs(uploadPath); // BAD
file.SaveAs(Path.Combine(uploadPath, file.FileName)); // GOOD
When a user tries to connect to your Web site, IIS assigns the connection to the IUSER_ComputerName account, where ComputerName is the name of the server on which IIS is running. By default, the IUSER_ComputerName account is a member of the Guests group. This group has security restrictions. Try to grand access to IUSER_ComputerName to that folder
Here is very good described answer about IIS security
Hope this helps
I got the error because I didn't realize that the destination should be a file. I had a folder as the second parameter (which works in cmd). and I got Unhandled Exception: System.UnauthorizedAccessException: Access to the path is denied. because C# File.Move wants a file there, not just for the first parameter, but for the second too, and so if you put a directory as second parameter, it's trying to write a file like c:\crp when you have a directory called c:\crp.
this would be incorrect File.Move(args[0],"c:\\crp");
So, this would be correct File.Move(args[0],"c:\\crp\\a.a");
The same goes for File.Copy
Right-click on Visual studio and click Run as Administrator
Thanks for +1
If this is an IIS website that is having the problem, check the Identity property of the advanced settings for the application pool that the site or application uses. You may find that it is set to ApplicationPoolIdentity, and in that case then this is the user that will have to have access to the path.
Or you can go old style and simply set the Identity to Network Service, and give the Network Service user access to the path.
You need to modify the privileges of the folder you're trying to delete from/save to. Right-click on the containing folder and use the Security tab to permit modify rights for the user your application runs under.
An UnauthorizedAccessException exception is thrown when the operating system denies access because of an I/O error or a security error.
If you are attempting to access a file or registry key, make sure it is not read-only.
I have also faced this issue when my window service started throwing the exception
System.UnauthorizedAccessException: Access to the path "C:\\Order\\Media
44aa4857-3bac-4a18-a307-820450361662.mp4" is denied.
So as a solution, I checked the user account associated with my service, as shown in below screen capture
So in my case it was NETWORK SERVICE
And then went to the folder properties to check if the associated user account also exists under their permission tab. It was missing in my case and when I added it and it fixed my issue.
For more information please check the below screen capture
same issue for me too,
I was pointing the folder instead of file.
so make sure in path, give path+filename
System.IO.File.WriteAllBytes("path", bytearray);
The exception that is thrown when the operating system denies access
because of an I/O error or a specific type of security error.
I hit the same thing. Check to ensure that the file is NOT HIDDEN.
Check your files properties. If the read-only is checked, uncheck it. This was my personal issue with the UnauthorizedAccessException.
I got this error and solved it in just a moment. Don't know why all of my folders are read-only,I cancelled the read-only and apply it. However, it is still read-only. So I moved the file into the root folder, it works - so weird.
I was facing this error because
Sometimes when I Combine the path with File Name and FileName = ""
It become Path Directory not a file which is a problem as mentioned above
so you must check for FileName like this
if(itemUri!="")
File.Delete(Path.Combine(RemoteDirectoryPath, itemUri));
I was trying to use System.IO.File.OpenWrite(path)
and it did not work because I was only passing OpenWrite() a path to a directory, but it requires a path all the way to the file you want to write. So a full path including the filename.extension at the end needs to be passed into OpenWrite to avoid UnauthorizedAccessException
In my case the problem was Norton. My in-house program doesn't have the proper digital signature and when it tried to delete a file it gave the UnauthorizedAccessException.
If it give you a notification, you can handle it from there. In my case it didn't give a notification that I noticed. So here's how to keep Norton from blocking the program.
Open Norton
Click the down arrow
Click History
Find activity by program
Click More Options
Click Exclude Process
To solve this problem, I follow the Scot Hanselman approach at Debugging System.UnauthorizedAccessException (often followed by: Access to the path is denied) article, the code with example is bellow:
class Program
{
static void Main(string[] args)
{
var path = "c:\\temp\\notfound.txt";
try
{
File.Delete(path);
}
catch (UnauthorizedAccessException)
{
FileAttributes attributes = File.GetAttributes(path);
if ((attributes & FileAttributes.ReadOnly) == FileAttributes.ReadOnly)
{
attributes &= ~FileAttributes.ReadOnly;
File.SetAttributes(path, attributes);
File.Delete(path);
}
else
{
throw;
}
}
}
}
I had the same problem on a newly moved website on a shared server. Solved through the web host panel (DotNetPanel) setting true the "allow write permissions". So if you are in a shared server before reviewing all code worth taking a look at the server configuration and could save you a lot of time.
Be aware that if you are trying to reach a shared folder path from your code, you dont only need to give the proper permissions to the physicial folder thru the security tab. You also need to "share" the folder with the corresponding app pool user thru the Share Tab
I had the exact error when deleting a file. It was a Windows Service running under a Service Account which was unable to delete a .pdf document from a Shared Folder even though it had Full Control of the folder.
What worked for me was navigating to the Security tab of the Shared Folder > Advanced > Share > Add.
I then added the service account to the administrators group, applied the changes and the service account was then able to perform all operations on all files within that folder.
For those trying to make a UWP (Universal Windows) application, file permissions are much more restricted, and in general is deny by default. It also supersedes the system user permissions. You will basically only have access to files in either
Your install location
Your AppData location
Files selected through the File or Folder picker
Locations requested in your App Manifest
You can read more here for details => https://learn.microsoft.com/en-us/windows/uwp/files/file-access-permissions
If you're using BitDefender there's a good chance its Safe Files feature blocked your operation. This is a form of Ransomware protection that comes with some of its more advanced versions.
Make sure to grant your application access in BitDefender and try again.
Some more details can be found in this BitDefender support page.
In my case it was my AVG anti-virus that triggered the exception.
I added my VS Projects directory to the "Allowed" list. And I had to add the executable to the AVG exceptions list after I copied the .exe to my App directory.
I've had the same problem and I've managed to get it working by changing the partition on which the file will be saved. So, on line 5 I've changed #"C:\" to be #"D:\" and that resolved the problem.
static void SaveVideoToDisk(string link)
{
var youTube = YouTube.Default; // starting point for YouTube actions
var video = youTube.GetVideo(link); // gets a Video object with info about the video
File.WriteAllBytes(#"D:\" + video.FullName, video.GetBytes());
}
After migrating from Visual Studio 2017 to Visual Studio 2019 I faced two exceptions with two of my applications which run properly under Visual Studio 2017:
System.UnauthorizedAccessException
System.ArgumentException
It turned out that I had to add the executables of the two applications to the allowed apps of Avast Antivirus.
I too faced the same problem when trying to do this after deployment at server:
dirPath = Server.MapPath(".") + "\\website\\" + strUserName;
if (!Directory.Exists(dirPath))
{
DirectoryInfo DI = Directory.CreateDirectory(dirPath);
}
string filePath = Server.MapPath(".") + "\\Website\\default.aspx";
File.Copy(filePath, dirPath + "\\default.aspx", true);
File.SetAttributes(dirPath + "\\default.aspx", FileAttributes.Normal);
I granted permission in IIS to other group including administrator and my problem got solved.
In my particular case I was repeatedly creating and deleting 10000 folders. It seems to me that the problem was in that although the method Directory.Delete(path, true) returns, the underling OS mechanism may still be deleting the files from the disk. And when I am starting to create new folders immediately after deletion of old ones, some of them are still locked because they are not completely deleted yet. And I am getting System.UnauthorizedAccessException: "Access to the path is denied".
Using Thread.Sleep(5000) after Directory.Delete(path, true) solves that problem. I absolutely agree that this is not safe, and I am not encouraging anyone to use it. I would love to here a better approach to solve this problem to improve my answer. Now I am just giving an idea why this exception may happen.
class Program
{
private static int numFolders = 10000;
private static string rootDirectory = "C:\\1";
static void Main(string[] args)
{
if (Directory.Exists(rootDirectory))
{
Directory.Delete(rootDirectory, true);
Thread.Sleep(5000);
}
Stopwatch sw = Stopwatch.StartNew();
CreateFolder();
long time = sw.ElapsedMilliseconds;
Console.WriteLine(time);
Console.ReadLine();
}
private static void CreateFolder()
{
var one = Directory.CreateDirectory(rootDirectory);
for (int i = 1; i <= numFolders; i++)
{
one.CreateSubdirectory(i.ToString());
}
}
}
First just check the path if the colon(:) character is missing or not after the drive letter. If colon is not missing then you can check if access/write permission is granted for that path.
I had the same issue and i was only missing the colon, permission and everything else was fine.
C:\folderpath
will work fine but,
C\folderpath .........(missing colon)
will give you access denial error.
I also ran into this post as dealing with the same issue. Looks like the file is in use and hence not able to write to it.
Though not able to figure it out, which process is using it. Signed out the other user who was logged in in that box, dont see any users who is holding it.
Any quick tips regarding on how to find the same.
Thanks,
Lakshay (developer)

C# Copy file to folder with permissions

I'm writing a program that, among other things, needs to copy a particular file to a network folder. Since I'm on a company network, the credentials needed to access that folder are the same as my Windows credentials.
The program works if I open the folder in Explorer, provide my username and password, and then run the uploader. It doesn't work without first providing that username and password.
How do I tell System.IO to supply my DefaultNetworkCredentials to the Copy method? Or is there another method I can use to get this done?
string pathToFile = "myfile.csv";
string pathToRemoteFile = "\\server.domain.tld\Documents\Subfolder\myfile.csv"
System.IO.File.Copy(pathToFile, pathToRemoteFile); // Fails with IOException "can't find network path"
Thanks!
~ Wogan
The error suggests that it is an incorrect path rather than a permissions problem.
Try this:
string pathToRemoteFile = #"\\server.domain.tld\Documents\Subfolder\myfile.csv"
[The # is the string literal quoting symbol; without it the backslash is a special character]

Categories

Resources