创建目录(如果不存在)

时间:2016-03-31 07:49:02

标签: c# logging asp.net-mvc-5

我想为不同的操作制作日志。我每天创建一个新文件,日期为文件名。现在,如果目录不存在,我希望系统为我创建目录。我搜索了这个主题,所有答案都是相同的:使用Directory.CreateDirectory(FilePath);。然而,这似乎不起作用。可能会遗漏一些明显的东西。

以下是代码:

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();
            }
        }
    }

错误讯息:

  

发生了'System.IO.DirectoryNotFoundException'类型的异常   在mscorlib.dll中但未在用户代码中处理

     

其他信息:无法找到路径的一部分   'C:\用户\ *** \源\回购\项目\项目名\日志\ WZCLogs \ 31032016.txt'。

3 个答案:

答案 0 :(得分:13)

可以在C:\(安装操作系统的默认驱动器)中创建该文件夹。文件夹位置是C:\Logs\WZCLogs\。您可以通过再次执行代码来确认在驱动器中的某个位置创建了文件夹,这次if (!Directory.Exists(FilePath))返回true。由于您没有指定任何位置,因此编译器假定为So.检查是否已创建;

你可以扩展试试这样:

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

如果路径是错误的,肯定会抛出异常;我试过" X:\ sample"这给了我例外:

  

无法找到路径的一部分' X:\ sample

如果我尝试使用Logs\WZCLogs,第一次不会给出任何例外,并且第二次跳过if;因此我发现该文件夹是在其他地方创建的;

您可以进行这些更改以使其有效:

 string FilePath=Path.Combine(HostingEnvironment.ApplicationPhysicalPath, @"Logs\WZCLogs");

答案 1 :(得分:3)

创建目录时需要使用绝对路径。请尝试以下方法:

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();
     }
}

如果目录已存在,则无需先检查目录是否存在,因为CreateDirectory方法没有副作用。使用Path.Combine而不是直接连接字符串也是一种好习惯,但要确保第二个参数不是以斜杠开头。

您还可以使用File.AppendAllText方法而不是创建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);
}

答案 2 :(得分:-1)

char str[] = "folder_name";
//if directory doesn't exist then create it
mkdir(str);