Как мне создать файл и любые папки, если папки не существуют? - PullRequest
113 голосов
/ 08 июля 2010

представьте, что я хочу создать (или перезаписать) следующий файл: - C:\Temp\Bar\Foo\Test.txt

Используя метод File.Create (..) , это можно сделать.

НО, если у меня нет ни одной из следующих папок (из приведенного выше примера пути)

  • Temp
  • Bar
  • Foo

затем я получаю DirectoryNotFoundException брошено.

Итак .. с указанным путем, как мы можем рекурсивно создать все папки, необходимые для созданияфайл ... для этого пути? Если папки Temp или Bar существуют, но Foo не ..., то это тоже создается.

Для простоты, давайте предположим, что проблем безопасности нет - все разрешениявсе в порядке и т. д.

Ответы [ 9 ]

112 голосов
/ 17 августа 2013

Подводя итог тому, что было прокомментировано в других ответах:

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

Directory.CreateDirectory создаст каталоги рекурсивно, и если каталог уже существует, он вернется без ошибки.

Если там был файл Foo на C:\Temp\Bar\Foo, будет выдано исключение.

104 голосов
/ 08 июля 2010
DirectoryInfo di = Directory.CreateDirectory(path);
Console.WriteLine("The directory was created successfully at {0}.",
    Directory.GetCreationTime(path));

См. эту страницу MSDN .

Надеюсь, это поможет!

16 голосов
/ 08 июля 2010

Используйте Directory.CreateDirectory перед созданием файла. Он создает папку рекурсивно для вас.

3 голосов
/ 08 июля 2010

Вам потребуется проверить обе части пути (каталог и имя файла) и создать каждую, если она не существует.

Используйте File.Exists и Directory.Exists, чтобы выяснить, существуют ли они.Directory.CreateDirectory создаст для вас весь путь, поэтому вам нужно будет вызвать его только один раз, если каталог не существует, а затем просто создать файл.

2 голосов
/ 08 июля 2010

. учитывая путь, как мы можем рекурсивно создать все папки, необходимые для создания файла .. для этого пути

Создает все каталоги и подкаталоги, как указано в path.

Directory.CreateDirectory(path);

тогда вы можете создать файл.

2 голосов
/ 08 июля 2010

Вы должны использовать Directory.CreateDirectory.

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

1 голос
/ 02 декабря 2016

Я знаю, что здесь есть и другие ответы, но ни один из них не является достаточно полным, следующий код создаст каталоги (если не существует) и затем скопирует файлы .

// 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"));
        }
    }
}
0 голосов
/ 08 июля 2010

Предполагая, что ваша сборка / exe имеет FileIO разрешение само по себе, ну не правильно.Ваше приложение может не работать с правами администратора.Важно учитывать Code Access Security и , запрашивающие разрешения Пример кода:

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 Code Access Security

Является ли «Защита доступа к коду» какой-либо реальной практикой использования?

0 голосов
/ 08 июля 2010

Вы хотите 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);
        }
    }

}

}

...