Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Create directory if not exists

I want to make logs for differenct actions. I create a new file every day with the date as file name. Now, if the directory doesnt exist, I want the system to make the directory for me. I have searched for this topic and all answers come to the same thing: use Directory.CreateDirectory(FilePath);. However this doesnt seem to work. Might be missing something obvious.

Here's the code:

public class ElderlyHomeLog : ILog
    {
        private const string FilePath = "/Logs/WZCLogs/";
        public void MakeLog(string text)
        {
            if (!Directory.Exists(FilePath))
            {
                Directory.CreateDirectory(FilePath);
            }
            string logFile = DateTime.Now.ToString("ddMMyyyy") + ".txt";
            if (!File.Exists(HostingEnvironment.ApplicationPhysicalPath + FilePath + logFile))
            {
                FileStream f = File.Create(HostingEnvironment.ApplicationPhysicalPath + FilePath + logFile);
                f.Close();
            }

            using (StreamWriter sw = new StreamWriter(HostingEnvironment.ApplicationPhysicalPath + FilePath + logFile, true))
            {
                sw.WriteLine(text);
                sw.Close();
            }
        }
    }

Error message:

An exception of type 'System.IO.DirectoryNotFoundException' occurred in mscorlib.dll but was not handled in user code

Additional information: Could not find a part of the path 'C:\Users\***\Source\Repos\Project\ProjectName\Logs\WZCLogs\31032016.txt'.

like image 542
ckindt Avatar asked Mar 31 '16 07:03

ckindt


People also ask

How do you create a directory if it does not exist in Python?

import os path = '/Users/krunal/Desktop/code/database' os. makedirs(path, exist_ok=False) print("The new directory is created!") So that's how you easily create directories and subdirectories in Python with makedirs(). That's it for creating a directory if not exist in Python.

Does mkdir check if directory exists?

mkdir indeed emits an error if the directory exists, unless using the -p flag. in error, you could check for the code like this if(err. code == 'EEXIST') this condition will get true if the directory already exists.

How do you create a directory if it doesn't exist in PowerShell?

PowerShell Create Directory If Not Exists using Test-Path If a path or directory is missing or doesn't exist, it will return $False. Using PowerShell New-Item cmdlet, it will create directory if not exists using Test-Path.

How do you create a directory in Java if it does not exist?

Create a Directory if it Does Not Exist You can use the Java File class to create directories if they don't already exists. The File class contains the method mkdir() and mkdirs() for that purpose. The mkdir() method creates a single directory if it does not already exist.


2 Answers

The folder may created in your C:\( the default drive where OS is installed). that is folder location is C:\Logs\WZCLogs\. you can confirm that a folder is created somewhere in the drive-by executing the code again, this time the if (!Directory.Exists(FilePath)) returns true. Since you have not specified any location the compiler assumes So. Check whether it is created or not;

You can extend the try Like this:

try
{
    Directory.CreateDirectory(FilePath);
}
catch (Exception ex)
{
    // handle them here
}

If the path is a wrong one definitely an exception will be thrown; I have tried with "X:\sample" which gives me the exception:

Could not find a part of the path 'X:\sample

Whereas if I tried with Logs\WZCLogs which won't give any exception for the first time and also skip the if for the second time; Hence I found that the folder is created somewhere else;

You can make these changes to make them work:

 string FilePath=Path.Combine(HostingEnvironment.ApplicationPhysicalPath, @"Logs\WZCLogs");
like image 177
sujith karivelil Avatar answered Oct 13 '22 02:10

sujith karivelil


You need to use the absolute path when creating the directory. Try the following:

private const string FilePath = "Logs/WZCLogs/";

public void MakeLog(string text)
{
     string directory = Path.Combine(HostingEnvironment.ApplicationPhysicalPath, FilePath);
     Directory.CreateDirectory(directory); // no need to check if it exists

     string logFile = Path.Combine(directory, DateTime.Now.ToString("ddMMyyyy") + ".txt");
     if (!File.Exists(logFile))
     {
         FileStream f = File.Create(logFile);
         f.Close();
     }

     using (StreamWriter sw = new StreamWriter(logFile, true))
     {
         sw.WriteLine(text);
         sw.Close();
     }
}

You do not need to check if the directory exists first as the CreateDirectory method has no side-effects if the directory is already present. It's also good practice to use Path.Combine rather than concatenating strings directly, but make sure the second parameter does not start with a slash.

You could also simplify your code by using the File.AppendAllText method instead of creating a FileStream.

private const string FilePath = "Logs/WZCLogs/";

public void MakeLog(string text)
{
    string directory = Path.Combine(HostingEnvironment.ApplicationPhysicalPath, FilePath);
    Directory.CreateDirectory(directory);

    string logFile = Path.Combine(directory, DateTime.Now.ToString("ddMMyyyy") + ".txt");
    File.AppendAllText(logFile, text + Environment.NewLine);
}
like image 37
Alsty Avatar answered Oct 13 '22 00:10

Alsty