【问题标题】:How do I create directory if it doesn't exist to create a file?如果创建文件不存在,如何创建目录?
【发布时间】:2011-02-26 16:15:58
【问题描述】:

如果目录不存在,我这里有一段代码会中断:

System.IO.File.WriteAllText(filePath, content);

是否可以在一行(或几行)中检查指向新文件的目录是否不存在,如果不存在,则在创建新文件之前创建它?

我正在使用 .NET 3.5。

【问题讨论】:

标签: c# .net file-io


【解决方案1】:

创建

(new FileInfo(filePath)).Directory.Create() 在写入文件之前。

....或者,如果存在,则创建(否则什么都不做)

System.IO.FileInfo file = new System.IO.FileInfo(filePath);
file.Directory.Create(); // If the directory already exists, this method does nothing.
System.IO.File.WriteAllText(file.FullName, content);

【讨论】:

  • 优雅的解决方案,因为它可以处理需要创建嵌套文件夹的情况。
  • 谢谢!我看到了stackoverflow.com/questions/9065598,但我想从文件的绝对路径开始,不想处理分割路径。现在我知道您可以从 FileInfo 实例访问目录。
  • 是否有异步方式来做到这一点?
  • 我想你可以用 Task.Run(() => ); 做到这一点。
  • @JoePhillips,你可以使用WriteAllTextAsync
【解决方案2】:

您可以使用以下代码

  DirectoryInfo di = Directory.CreateDirectory(path);

【讨论】:

【解决方案3】:

正如@hitec 所说,您必须确保您拥有正确的权限,如果这样做,您可以使用此行来确保目录的存在:

Directory.CreateDirectory(Path.GetDirectoryName(filePath))

【讨论】:

    【解决方案4】:

    将文件移动到不存在的目录的一种优雅方法是为原生 FileInfo 类创建以下扩展:

    public static class FileInfoExtension
    {
        //second parameter is need to avoid collision with native MoveTo
        public static void MoveTo(this FileInfo file, string destination, bool autoCreateDirectory) { 
    
            if (autoCreateDirectory)
            {
                var destinationDirectory = new DirectoryInfo(Path.GetDirectoryName(destination));
    
                if (!destinationDirectory.Exists)
                    destinationDirectory.Create();
            }
    
            file.MoveTo(destination);
        }
    }
    

    然后使用全新的 MoveTo 扩展:

     using <namespace of FileInfoExtension>;
     ...
     new FileInfo("some path")
         .MoveTo("target path",true);
    

    检查Methods extension documentation

    【讨论】:

      【解决方案5】:

      您可以使用File.Exists 检查文件是否存在,并在需要时使用File.Create 创建它。确保检查您是否有权在该位置创建文件。

      一旦您确定文件存在,您就可以安全地对其进行写入。尽管作为预防措施,您应该将代码放入 try...catch 块中,并捕获如果事情没有完全按计划进行时函数可能引发的异常。

      Additional information for basic file I/O concepts.

      【讨论】:

      • 我最初误读了您想要写入可能不存在的文件的问题。不过,文件和目录 IO 的概念基本相同。
      【解决方案6】:

      var filePath = context.Server.MapPath(Convert.ToString(ConfigurationManager.AppSettings["ErrorLogFile"]));

      var file = new FileInfo(filePath);

      file.Directory.Create();如果目录已经存在,这个方法什么也不做。

      var sw = new StreamWriter(filePath, true);

      sw.WriteLine(Enter your message here);

      sw.Close();

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2015-05-10
        • 2017-02-19
        • 1970-01-01
        • 2017-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多