如果目录不存在,该如何创建目录?


202

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

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

在一行(或几行)中,是否可以检查导致新文件的目录是否不存在,如果不存在,请在创建新文件之前创建该目录?

我正在使用.NET 3.5。



@TimSchmelter,“可能重复”是一种清理方法-关闭类似的问题,并为每个问题提供最佳答案。日期不是必需的。参见meta.stackexchange.com/questions/147643/…如果您同意需要澄清,请对meta.stackexchange.com/questions/281980/…
Michael Freidgeim

Answers:


394

创造

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

5
优雅的解决方案,可处理需要创建嵌套文件夹的情况。
丹尼·雅各布

谢谢!我看到了stackoverflow.com/questions/9065598,但是我想从文件的绝对路径开始,并且不想处理分割路径。现在,我知道您可以从FileInfo实例访问目录。
约翰,

有异步方法可以做到这一点吗?
乔·菲利普斯

1
我想你可以做到Task.Run(() => );


34

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

Directory.CreateDirectory(Path.GetDirectoryName(filePath))


0

将文件移动到不存在的目录的一种优雅方法是为本机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);

检查方法扩展文档


-1

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

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

基本文件I / O概念的其他信息


最初,我误读了您要写入可能不存在的文件的问题。不过,这些概念对于文件和目录IO基本上是相同的。
hitec 2010年

-2

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

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.