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

假设我希望创建(或覆盖)以下文件:-C:\Temp\Bar\Foo\Test.txt

使用 创建(. .)方法,就可以做到这一点。

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

  • 临时工
  • 酒吧
  • 阿福

然后我得到一个 DirectoryNotFoundException抛出。

所以. . 给定一个路径,我们如何递归地创建所有必要的文件夹来创建该路径的文件?如果 Temp 或 Bar 文件夹存在,但 Foo 不存在... 那么它也会被创建。

为简单起见,假设没有安全问题——所有权限都没问题,等等。

156852 次浏览

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

使用 File.ExistsDirectory.Exists查明它们是否存在。Directory.CreateDirectory将为您创建整个路径,所以如果目录不存在,您只需要调用一次,然后就可以创建文件了。

在创建文件之前使用 目录。它递归地为您创建文件夹。

您应该使用 Directory.CreateDirectory。

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

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

根据路径指定创建所有目录和子目录。

Directory.CreateDirectory(path);

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

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

参见 这个 MSDN 页面

希望能帮上忙!

您需要 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 文件权限本身,则不正确。您的应用程序可能无法使用管理员权限运行。考虑 代码访问安全请求 < a href = “ http://msdn.microsoft.com/en-us/library/system.security.permission. fileiopermission. aspx”rel = “ nofollow noReferrer”> 权限是很重要的 示例代码:

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

“代码访问安全”在现实世界中有用吗?

总结其他答复中的评论:

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

Directory.CreateDirectory将递归地创建目录,如果目录已经存在,它将返回,不会出现错误。

如果在 C:\Temp\Bar\Foo处碰巧有一个文件 Foo,则会引发异常。

下面的代码将 创建目录(如果不存在) ,然后 复制文件

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