假设我想创建或覆盖以下文件:- C:\Temp\Bar\Foo\Test.txt
使用File.Create(..)方法可以实现。
但是,如果我没有以下任何一个文件夹(来自上述路径的示例)
- Temp
- Bar
- Foo
那么就会抛出DirectoryNotFoundException。
因此...给定一个路径,我们如何递归地创建所有必要的文件夹以创建该路径下的文件?如果Temp或Bar文件夹存在,但没有Foo,则也会创建它。
为简单起见,假设没有安全问题--所有权限都可以,等等。
假设我想创建或覆盖以下文件:- C:\Temp\Bar\Foo\Test.txt
使用File.Create(..)方法可以实现。
但是,如果我没有以下任何一个文件夹(来自上述路径的示例)
那么就会抛出DirectoryNotFoundException。
因此...给定一个路径,我们如何递归地创建所有必要的文件夹以创建该路径下的文件?如果Temp或Bar文件夹存在,但没有Foo,则也会创建它。
为简单起见,假设没有安全问题--所有权限都可以,等等。
总结其他答案中提到的内容:
//path = @"C:\Temp\Bar\Foo\Test.txt";
Directory.CreateDirectory(Path.GetDirectoryName(path));
Directory.CreateDirectory
方法会递归地创建目录,如果该目录已经存在,则不会出现错误。
但是,如果在指定的路径中存在同名文件 Foo
,则会抛出异常。
DirectoryInfo di = Directory.CreateDirectory(path);
Console.WriteLine("The directory was created successfully at {0}.",
Directory.GetCreationTime(path));
请参考此MSDN页面。
Directory.CreateDirectory
,不需要先检查Directory.Exists
- 如果目录已经存在,它不会抛出异常。 - Tim Robinsonpath
不应包含文件名。因此,使用 OP 的示例,path
应为 C:\Temp\Bar\Foo
。在调用 Directory.CreateDirectory(path)
后,仍需调用 File.Create("C:\Temp\Bar\Foo\Test.txt")
来创建文件。 - sazrDirectory.CreateDirectory(path);
File.Exists
和Directory.Exists
来确定是否存在。如果目录不存在,Directory.CreateDirectory
会为您创建整个路径,因此,如果目录不存在,只需调用一次,然后简单地创建文件即可。假设您的程序集/可执行文件本身具有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);
}
// 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"));
}
}
}
你想使用 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);
}
}
}
}
using Microsoft.VisualBasic;
真是太邪恶了!! - Pure.Krome