Как создать файл и любые папки, если папки не существуют?

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

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

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

  • Temp
  • Bar
  • Foo

тогда я получаю DirectoryNotFoundException.

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

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

Ответ 1

// Determine whether the directory exists.
if (Directory.Exists(path)) 
{
    Console.WriteLine("That path exists already.");
    return;
}

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

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

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

Ответ 2

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

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

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

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

Ответ 3

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

Ответ 4

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

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

Ответ 6

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

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

Directory.CreateDirectory(path);

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

Ответ 7

Вы хотите, чтобы Directory.CreateDirectory()

Вот класс, который я использую (преобразованный в С#), если вы передадите ему исходный каталог и пункт назначения, он скопирует все файлы и подпапки этого каталога в пункт назначения:

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

Предполагая, что ваша сборка /exe имеет FileIO, это само по себе, хорошо не правильно. Приложение не может работать с правами администратора. Важно рассмотреть Безопасность доступа кодов и запрос 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);
}

Понимание безопасности доступа к кодам .NET

Является ли "Безопасность доступа к коду" для любого реального мира?

Ответ 9

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

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