想象一下我想创建(或覆盖)以下文件: - C:\Temp\Bar\Foo\Test.txt
使用File.Create(..)方法,可以做到这一点。
但是,如果我没有以下任何一个文件夹(来自上面的示例路径)
然后我得到一个DirectoryNotFoundException抛出。
所以... 给定一个路径,我们如何递归创建创建文件所需的所有文件夹..对于该路径?如果存在Temp或Bar文件夹,但Foo不存在...那么这也是创造的。
为简单起见,我们假设没有安全问题 - 所有权限都很好等等。
答案 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.Exists
和Directory.Exists
来确定它们是否存在。 Directory.CreateDirectory
将为您创建整个路径,因此如果目录不存在,您只需要调用一次,然后只需创建文件。
答案 4 :(得分:2)
您应该使用Directory.CreateDirectory。
答案 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 Security和requesting 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);
}