ChatGPT解决这个技术问题 Extra ChatGPT

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

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

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

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

我正在使用.NET 3.5。

@TimSchmelter,“可能重复”是一种清理方法 - 关闭类似问题并保留最佳答案。日期不是必需的。请参阅 meta.stackexchange.com/questions/147643/… 如果您同意需要澄清,请在 meta.stackexchange.com/questions/281980/… 上投票

I
IKavanagh

去创造

(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
R
Ram

您可以使用以下代码

  DirectoryInfo di = Directory.CreateDirectory(path);

Directory.CreateDirectory 完全符合您的要求:如果该目录尚不存在,它会创建该目录。 无需先进行明确检查
如果 path 是文件而不是目录,则引发 IOException。 msdn.microsoft.com/en-us/library/54a0at6s(v=vs.110).aspx
S
SwDevMan81

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

Directory.CreateDirectory(Path.GetDirectoryName(filePath))


M
MiguelSlv

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


P
Peter Mortensen

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

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

Additional information for basic file I/O concepts


我最初误读了您想要写入可能不存在的文件的问题。不过,文件和目录 IO 的概念本质上是相同的。
G
Godwin Awojobi

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