如果文件夹不存在,如何创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。
。 给定一个path,我们如何recursion地创build所有必要的文件夹来创build文件
根据path指定创build所有目录和子目录。
Directory.CreateDirectory(path);
那么你可以创build一个文件。
您将需要检查path的两部分(目录和文件名),并创build每个部分(如果不存在)。
使用File.Exists
和Directory.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")); } } }