创建文件,递归创建目录

MxL*_*evs 49 c#

我正在为C#阅读一些文件IO教程,并设法写出一些文件,但如果我给出的路径包含目录怎么办?

例如,我想创建名为data/my_fileexcept data文件夹的文件不存在.

这条线,

BinaryWriter outFile = new BinaryWriter(File.OpenWrite(path));
Run Code Online (Sandbox Code Playgroud)

path上面的字符串在哪里,与路径的一部分不存在的消息崩溃,这意味着C#没有根据需要创建它们.

我希望C#处理所有杂乱的目录创建并检查我,而不是我必须解析路径并创建所有必要的目录.这可能吗?否则,是否有一段代码我可以复制到我的项目中,它将处理我可能忽略的任何事情(因为我对文件管理不太了解).

Eri*_* J. 109

System.IO.Directory.CreateDirectory()将创建指定路径中的所有目录和子目录(如果它们尚不存在).

您可以调用它,传递路径,以确保在写入文件之前创建文件夹结构.

  • 如果至少为BinaryWriter提供一个布尔参数,询问是否要创建目录(如果它们不存在),那将是非常方便的.我想如果你*总是*这样做,有人会有一个用例,他们不希望这种行为,并会抱怨他们无法控制它. (11认同)

Ete*_*l21 9

虽然System.IO.Directory.CreateDirectory()确实会递归地为你创建目录,但我遇到了一种情况,我不得不想出自己的方法.基本上,System.IO不支持超过260个字符的路径,这迫使我使用Delimon.Win32.IO库,它使用长路径,但不会递归创建目录.

这是我用于递归创建目录的代码:

void CreateDirectoryRecursively(string path)
{
    string[] pathParts = path.Split('\\');

    for (int i = 0; i < pathParts.Length; i++)
    {
        if (i > 0)
            pathParts[i] = Path.Combine(pathParts[i - 1], pathParts[i]);

        if (!Directory.Exists(pathParts[i]))
            Directory.CreateDirectory(pathParts[i]);
    }
}
Run Code Online (Sandbox Code Playgroud)

  • 探索器上没有探测器超过255个字符的barf?它很糟糕,但我很快就会截断它,而不是试图处理那个垃圾. (2认同)

小智 7

这是我通常的做法

Directory.CreateDirectory(Path.GetDirectoryName(filePath));
Run Code Online (Sandbox Code Playgroud)

^ 这应该确保在您的文件之前创建所有必需的文件夹(无论其中一些文件夹是否已经存在)。例如,如果你传递它“c:/a/b/c/data/my file.txt”,它应该确保“c:/a/b/c/data”路径被创建。