Introduction
When working with ASP.NET applications, logging is a common requirement, especially for tracking errors, API responses, or authentication events. One frequently encountered runtime error while implementing file-based logging is:
Could not find a part of the path
E:\2026 ProjectList\Project's\CoreConversation\ReferenceProject\~singlsignonlog\singlsignon_log13-01-26.txt
This error usually appears when calling File.AppendAllText() and indicates that the application is trying to write to a file location that does not exist or is incorrectly mapped.
Problematic Logging Code
Consider the following logging method used in an ASP.NET application:
public static void Singlsignon_log(string res)
{
try
{
File.AppendAllText(
HttpContext.Current.Server.MapPath(
"~singlsignonlog/singlsignon_log" +
DateTime.Now.ToString("dd-MM-yy") + ".txt"),
"{" + DateTime.Now.ToString() + "} " + res + Environment.NewLine
);
}
catch (Exception ex)
{
File.AppendAllText(
HttpContext.Current.Server.MapPath(
"~singlsignonlog/singlsignon_log" +
DateTime.Now.ToString("dd-MM-yy") + ".txt"),
"{" + DateTime.Now.ToString() + "} " + ex.Message + Environment.NewLine
);
}
}
At first glance, the code appears correct, but there are two critical issues that cause the exception.
Issue 1: Incorrect Use of Server.MapPath
In ASP.NET, the tilde (~) must always be followed by a forward slash. Using ~singlsignonlog instead of ~/singlsignonlog results in an invalid physical path being generated.
Issue 2: Directory Does Not Exist
The File.AppendAllText() method does not create directories automatically. If the singlsignonlog folder does not already exist in the application root, the method throws a "Could not find a part of the path" exception.
Because of these two issues, the application fails at runtime when it attempts to write the log file.
Correct and Safe Implementation
A safer approach is to resolve the folder path correctly and ensure that the directory exists before writing to the file. The revised method below fixes both problems:
public static void Singlsignon_log(string res)
{
try
{
string folderPath =
HttpContext.Current.Server.MapPath("~/singlsignonlog/");
if (!Directory.Exists(folderPath))
{
Directory.CreateDirectory(folderPath);
}
string filePath = Path.Combine(
folderPath,
"singlsignon_log" +
DateTime.Now.ToString("dd-MM-yy") + ".txt"
);
File.AppendAllText(
filePath,
"{" + DateTime.Now + "} " + res + Environment.NewLine
);
}
catch
{
// Avoid logging inside catch to prevent recursive failures
}
}
Why This Fix Works
The virtual path is correctly written as ~/singlsignonlog/, ensuring that Server.MapPath resolves it to a valid physical directory
The code checks whether the directory exists and creates it if necessary
This prevents runtime exceptions related to missing folders
Additional Best Practices
Avoid performing file logging inside the catch block using the same logic. If logging fails for any reason, attempting to log the exception again can lead to repeated failures or even application crashes. In production systems, it is better to silently handle logging failures or route them to a fallback logging mechanism.
For real-world ASP.NET applications, it is also recommended to store log files inside the App_Data folder. This folder is designed for application data and helps avoid permission issues on hosting servers.
Conclusion
A small mistake in virtual path usage or directory validation can lead to runtime logging failures. By correcting Server.MapPath usage and ensuring directories exist before writing files, logging becomes reliable across development, testing, and production environments.