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

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

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

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

  • Temp
  • Bar
  • Foo

затем я получаю DirectoryNotFoundException . /р>

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

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

98 голосов | спросил Pure.Krome 8 J000000Thursday10 2010, 11:51:13

9 ответов


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

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

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

ответил Christopher B. Adkins 8 J000000Thursday10 2010, 11:56:59
0

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

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

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

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

ответил hultqvist 17 PM00000090000005731 2013, 21:12:57
0

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

ответил Grzenio 8 J000000Thursday10 2010, 11:55:55
0

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

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

ответил Nick 8 J000000Thursday10 2010, 11:56:04
0
  

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

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

Directory.CreateDirectory(path);

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

ответил Arseny 8 J000000Thursday10 2010, 11:56:48
0

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

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

ответил Oded 8 J000000Thursday10 2010, 11:54:50
0

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

// 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"));
        }
    }
}
ответил Mehdi Dehghani 2 FriEurope/Moscow2016-12-02T09:22:51+03:00Europe/Moscow12bEurope/MoscowFri, 02 Dec 2016 09:22:51 +0300 2016, 09:22:51
0

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

}

}

ответил Markive 8 J000000Thursday10 2010, 12:00:02
0

Предполагая, что ваша сборка /исполняемый файл имеет 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);
}

Общие сведения о безопасности доступа к .NET Code

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

ответил PRR 8 J000000Thursday10 2010, 13:41:32

Похожие вопросы

Популярные теги

security × 330linux × 316macos × 2827 × 268performance × 244command-line × 241sql-server × 235joomla-3.x × 222java × 189c++ × 186windows × 180cisco × 168bash × 158c# × 142gmail × 139arduino-uno × 139javascript × 134ssh × 133seo × 132mysql × 132