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'.
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.
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.
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.
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.
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");
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);
}
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With