158

想象一下,我希望创建(或覆盖)以下文件:-C:\Temp\Bar\Foo\Test.txt

使用File.Create(..)方法,可以做到这一点。

但是,如果我没有以下任一文件夹(来自上面的示例路径)

  • 温度
  • 酒吧

然后我得到一个DirectoryNotFoundException抛出。

所以..给定一个路径,我们如何递归地创建为该路径创建文件..所需的所有文件夹? 如果 Temp 或 Bar 文件夹存在,但 Foo 不存在……那么它也会被创建。

为简单起见,我们假设没有安全问题——所有权限都很好,等等。

4

9 回答 9

166

总结其他答案中的评论:

//path = @"C:\Temp\Bar\Foo\Test.txt";
Directory.CreateDirectory(Path.GetDirectoryName(path));

Directory.CreateDirectory将递归创建目录,如果目录已经存在,它将返回而不会出错。

如果碰巧有一个文件FooC:\Temp\Bar\Foo就会抛出异常。

于 2013-08-17T17:12:57.703 回答
133
DirectoryInfo di = Directory.CreateDirectory(path);
Console.WriteLine("The directory was created successfully at {0}.",
    Directory.GetCreationTime(path));

请参阅此 MSDN 页面

希望能有所帮助!

于 2010-07-08T07:56:59.423 回答
16

在创建文件之前使用Directory.CreateDirectory 。它为您递归地创建文件夹。

于 2010-07-08T07:55:55.510 回答
4

您将需要检查路径的两个部分(目录和文件名),如果不存在则创建每个部分。

使用File.ExistsDirectory.Exists找出它们是否存在。Directory.CreateDirectory将为您创建整个路径,因此如果目录不存在,您只需调用一次,然后只需创建文件。

于 2010-07-08T07:54:50.370 回答
4

. 给定一个路径,我们如何递归地创建创建文件所需的所有文件夹..为该路径

创建路径指定的所有目录和子目录。

Directory.CreateDirectory(path);

然后你可以创建一个文件。

于 2010-07-08T07:56:48.787 回答
2

您应该使用 Directory.CreateDirectory。

http://msdn.microsoft.com/en-us/library/54a0at6s.aspx

于 2010-07-08T07:56:04.220 回答
1

假设您的程序集/exe 本身具有FileIO权限,那是不对的。您的应用程序可能无法以管理员权限运行。重要的是要考虑代码访问安全性请求 权限 示例代码:

FileIOPermission f2 = new FileIOPermission(FileIOPermissionAccess.Read, "C:\\test_r");
f2.AddPathList(FileIOPermissionAccess.Write | FileIOPermissionAccess.Read, "C:\\example\\out.txt");
try
{
    f2.Demand();
}
catch (SecurityException s)
{
    Console.WriteLine(s.Message);
}

了解 .NET 代码访问安全性

“代码访问安全”是否在任何现实世界中使用?

于 2010-07-08T09:41:32.693 回答
0

你想要 Directory.CreateDirectory()

这是我使用的一个类(转换为 C#),如果您将源目录和目标传递给它,它将将该目录的所有文件和子文件夹复制到您的目标:

using System.IO;

public class copyTemplateFiles
{


public static bool Copy(string Source, string destination)
{

    try {

        string[] Files = null;

        if (destination[destination.Length - 1] != Path.DirectorySeparatorChar) {
            destination += Path.DirectorySeparatorChar;
        }

        if (!Directory.Exists(destination)) {
            Directory.CreateDirectory(destination);
        }

        Files = Directory.GetFileSystemEntries(Source);
        foreach (string Element in Files) {
            // Sub directories
            if (Directory.Exists(Element)) {
                copyDirectory(Element, destination + Path.GetFileName(Element));
            } else {
                // Files in directory
                File.Copy(Element, destination + Path.GetFileName(Element), true);
            }
        }

    } catch (Exception ex) {
        return false;
    }

    return true;

}



private static void copyDirectory(string Source, string destination)
{
    string[] Files = null;

    if (destination[destination.Length - 1] != Path.DirectorySeparatorChar) {
        destination += Path.DirectorySeparatorChar;
    }

    if (!Directory.Exists(destination)) {
        Directory.CreateDirectory(destination);
    }

    Files = Directory.GetFileSystemEntries(Source);
    foreach (string Element in Files) {
        // Sub directories
        if (Directory.Exists(Element)) {
            copyDirectory(Element, destination + Path.GetFileName(Element));
        } else {
            // Files in directory
            File.Copy(Element, destination + Path.GetFileName(Element), true);
        }
    }

}

}

于 2010-07-08T08:00:02.183 回答
0

以下代码将创建目录(如果不存在)然后复制文件

// using System.IO;

// for ex. if you want to copy files from D:\A\ to D:\B\
foreach (var f in Directory.GetFiles(@"D:\A\", "*.*", SearchOption.AllDirectories))
{
    var fi =  new FileInfo(f);
    var di = new DirectoryInfo(fi.DirectoryName);

    // you can filter files here
    if (fi.Name.Contains("FILTER")
    {
        if (!Directory.Exists(di.FullName.Replace("A", "B"))
        {                       
            Directory.CreateDirectory(di.FullName.Replace("A", "B"));           
            File.Copy(fi.FullName, fi.FullName.Replace("A", "B"));
        }
    }
}
于 2016-12-02T06:22:51.190 回答