Автоматически создавать каталоги с длинных путей

У меня есть набор файлов с полностью определенными путями (root/test/thing1/thing2/file.txt). Я хочу foreach по этой коллекции и отбросить файл в место, определенное в пути, однако, если некоторые каталоги не существуют, я хочу, чтобы они были созданы автоматически. Моя программа имеет по умолчанию "местоположение перехода", например z:/. "Место падения" начинается пустым, поэтому в моем примере выше первый элемент должен автоматически создавать каталоги, необходимые для создания z:/root/test/thing1/thing2/file.txt. Как я могу это сделать?

Ответ 1

foreach (var relativePath in files.Keys)
{
    var fullPath = Path.Combine(defaultLocation, relativePath);
    var directory = Path.GetDirectoryName(fullPath);

    Directory.CreateDirectory(directory);

    saveFile(fullPath, files[relativePath]);
}

где файлы IDictionary<string, object>.

Ответ 2

string somepath = @"z:/root/test/thing1/thing2/file.txt";
System.IO.Directory.CreateDirectory(System.IO.Path.GetDirectoryName( ( somepath ) );

Ответ 3

Directory.CreateDirectory("/root/...") 

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

Ответ 4

Отметьте пространство имен IO (Directory, Path), я думаю, они помогут вам

using System.IO

Затем проверьте это.

string fileName [email protected]"d:/root/test/thing1/thing2/file.txt"; 
string directory = Path.GetDirectoryName(fileName);
if (!Directory.Exists(directory))
    Directory.CreateDirectory(directory);

Ответ 5

string filename = "c:\\temp\\wibble\\wobble\\file.txt";
string dir = Path.GetDirectoryName(filename);
if (!Directory.Exists(dir))
{
    Directory.CreateDirectory(dir);
}
File.Create(filename);

с подходящей обработкой исключений, конечно.

Ответ 6

Я обнаружил, что установка "местоположение по умолчанию" в начале выполнения является полезной и уменьшает бит избыточного кода (например, Path.Combine(defaultLocation, relativePath)).

Пример:

var defaultLocation = "z:/";
Directory.SetCurrentDirectory(defaultLocation);
Directory.SetCurrentDirectory(AppContext.BaseDirectory);