如果文件夹不存在,如何创建文件和任何文件夹?


136

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

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

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

  • 温度
  • 酒吧
  • oo

然后我得到一个DirectoryNotFoundException抛出。

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

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



Answers:


122
DirectoryInfo di = Directory.CreateDirectory(path);
Console.WriteLine("The directory was created successfully at {0}.",
    Directory.GetCreationTime(path));

请参阅此MSDN页面

希望有帮助!


82
您可以先盲目调用,Directory.CreateDirectory而无需Directory.Exists先检查-如果目录已经存在,它不会抛出。
蒂姆·罗宾逊

1
@Tim:不确定,所以我把它扔在那里。谢谢你的信息。
Christopher B. Adkins 2010年

24
并且不要忘记Path.GetDirectoryName(string path)从完整路径获取目录
Oliver

@Oliver:Directory和DirectoryInfo类具有很多功能,但是我提供的代码足以使他朝正确的方向发展。我认为链接也扩展了很多。
Christopher B. Adkins,2010年

8
*注意:该变量path不应包含文件名。因此,使用OP的示例path应为C:\Temp\Bar\Foo。调用后,Directory.CreateDirectory(path);您仍然需要调用File.Create("C:\Temp\Bar\Foo\Test.txt");以创建文件。
sazr 2014年

139

总结在其他答案中已评论的内容:

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

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

如果碰巧是个文件FooC:\Temp\Bar\Foo一个异常将被抛出。


如果你正在处理的长路径(256+)见stackoverflow.com/questions/5188527/...
阿列克谢Levenkov


3

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

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

Directory.CreateDirectory(path);

那么您可以创建一个文件。


2
没有文件名的路径:)
Sameera R.16

“所有目录和子目录”不正确:它将最多创建一个目录和所有必需的子目录。
卡米洛·泰雷文托

3

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

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


对于Directory.CreateDirectory,您无需查看存在哪个部分。它将创建所需的所有目录(唯一要确保的是目标目录尚不存在)。
Gertjan

我建议在这种情况下删除您回答的第一行,因为他不需要从根目录检查每个部分,只需检查完整路径并创建(如果不存在)。
Gertjan

@Gertjan-答案已更新...希望它现在符合您的标准;)
Oded

:)它确实是:)(证明我不是错或冒犯你不是我的意思,但是初学者可以在答案中使用任何澄清方式)
Gertjan 2010年


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

}

}


2
我应该因为这一行而降级:using Microsoft.VisualBasic;邪恶!
Pure.Krome

2
为什么Microsoft.VisualBasic是邪恶的?它是一个与.Net Framework中的其他程序一样的程序集。
奥利弗

2
我想是因为您不必要导入其他语言的名称空间。
10年

0

假设您的程序集/ 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代码访问安全性

实际使用中的“代码访问安全性”吗?


1
@ Pure.Krome:尽管我的回答超出了目标,但在访问特权资源时仍要考虑安全性和访问控制。绝不意味着超越或使您的问题复杂化:)
PRR 2010年

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"));
        }
    }
}
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.