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

时间:2010-07-08 07:51:14

标签: c# .net file-access

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

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

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

  • 温度
  • 酒吧

然后我得到一个DirectoryNotFoundException抛出。

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

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

9 个答案:

答案 0 :(得分:111)

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

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

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

如果Foo处有文件C:\Temp\Bar\Foo,则会抛出异常。

答案 1 :(得分:103)

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

请参阅this MSDN page

希望有所帮助!

答案 2 :(得分:16)

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

答案 3 :(得分:2)

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

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

答案 4 :(得分:2)

您应该使用Directory.CreateDirectory。

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

答案 5 :(得分:2)

  

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

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

Directory.CreateDirectory(path);

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

答案 6 :(得分:1)

我知道这里还有其他一些答案,但其中没有一个不够完整,代码将创建目录(如果不存在)&然后复制文件

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

答案 7 :(得分: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);
        }
    }

}

}

答案 8 :(得分:0)

假设你的程序集/ exe拥有FileIO权限本身,那就不对了。您的应用程序可能无法以管理员权限运行考虑Code Access Securityrequesting permissions非常重要 示例代码:

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

Understanding .NET Code Access Security

Is “Code Access Security” of any real world use?