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

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

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

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

  • 温度
  • 酒吧

那么我得到一个DirectoryNotFoundException抛出。

所以.. 给定一个path,我们如何recursion创build所有必要的文件夹来创build文件..对于该path? 如果Temp或Bar文件夹存在,但是Foo不…然后创build。

为了简单起见,我们假设没有安全问题 – 所有的权限都是好的,等等。

 // Determine whether the directory exists. if (Directory.Exists(path)) { Console.WriteLine("That path exists already."); return; } // Try to create the directory. DirectoryInfo di = Directory.CreateDirectory(path); Console.WriteLine("The directory was created successfully at {0}.", Directory.GetCreationTime(path)); 

看到这个MSDN页面 。

希望有所帮助!

总结其他答案中的评论:

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

Directory.CreateDirectory将recursion地创build目录,如果目录已经存在,它将会返回而不会有错误。

如果在C:\Temp\Bar\Foo碰巧有一个文件Foo ,则会抛出一个exception。

在创build文件之前使用Directory.CreateDirectory 。 它recursion地为您创build文件夹。

你应该使用Directory.CreateDirectory。

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

。 给定一个path,我们如何recursion地创build所有必要的文件夹来创build文件

根据path指定创build所有目录和子目录。

 Directory.CreateDirectory(path); 

那么你可以创build一个文件。

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

使用File.ExistsDirectory.Exists找出它们是否存在。 Directory.CreateDirectory将为你创build整个path,所以如果目录不存在,你只需要调用一次,然后简单地创build该文件。

你想要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); } } } 

}

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

 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代码访问安全性

任何真实世界使用的“代码访问安全性”是什么?

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

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