.net 如果文件夹不存在,如何创建文件和任何文件夹?

3zwtqj6y  于 2022-12-27  发布在  .NET
关注(0)|答案(9)|浏览(472)

假设我希望创建(或覆盖)以下文件:-C:\Temp\Bar\Foo\Test.txt
使用File.Create(..)方法,可以做到这一点。
但是,如果我没有以下文件夹之一(从上面的示例路径)

  • 温度
  • 酒吧

然后抛出一个DirectoryNotFoundException
那么..**给定一个路径,我们如何递归地创建所有必要的文件夹来创建文件..对于该路径?**如果Temp或Bar文件夹存在,但Foo不存在...那么也会创建。
为了简单起见,我们假设没有安全问题--所有权限都很好,等等。

h4cxqtbf

h4cxqtbf1#

总结其他答复中的评论意见:

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

Directory.CreateDirectory将递归地创建目录,如果目录已经存在,它将返回而不出错。
如果在C:\Temp\Bar\Foo处碰巧存在文件Foo,则将抛出异常。

9cbw7uwe

9cbw7uwe2#

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

参见this MSDN page

bmp9r5qi

bmp9r5qi3#

在创建文件之前使用Directory.CreateDirectory,它会递归地创建文件夹。

o8x7eapl

o8x7eapl4#

.给定一个路径,我们如何递归创建创建该路径的文件所需的所有文件夹
创建由path指定的所有目录和子目录。

Directory.CreateDirectory(path);

那么您可以创建一个文件。

3npbholx

3npbholx5#

您需要检查路径的两个部分(目录和文件名),如果不存在,则创建每个部分。
使用File.ExistsDirectory.Exists来确定它们是否存在。Directory.CreateDirectory将为您创建整个路径,因此如果目录不存在,您只需要调用一次,然后简单地创建文件。

jk9hmnmh

jk9hmnmh7#

假设您的程序集/exe本身具有FileIO权限,这是不正确的。您的应用程序可能无法以管理员权限运行。考虑Code Access Securityrequestingpermissions非常重要示例代码:

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

Understanding .NET Code Access Security
Is “Code Access Security” of any real world use?

t5fffqht

t5fffqht8#

您需要目录。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);
        }
    }

}

}

9rygscc1

9rygscc19#

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

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

相关问题