Автоматически создавать каталоги от длинных путей
-
26-09-2019 - |
Вопрос
У меня есть коллекция файлов с полностью квалифицированными путями (root / test / thing1 / thing2 / file.txt). я бы хотел foreach
За эту коллекцию и отбросьте файл в местоположение, определенное на пути, если определенные каталоги не существуют, я хочу, чтобы они были отличными созданными автоматически. Моя программа имеет по умолчанию «Расположение падения», например z:/
. Отказ «Расположение падения» начинается пустой, поэтому в моем примере выше, первый элемент должен автоматически создавать каталоги, необходимые для создания z:/root/test/thing1/thing2/file.txt
. Отказ Как я могу это сделать?
Решение
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>
.
Другие советы
string somepath = @"z:/root/test/thing1/thing2/file.txt";
System.IO.Directory.CreateDirectory(System.IO.Path.GetDirectoryName( ( somepath ) );
Directory.CreateDirectory("/root/...")
Создает все каталоги и подкаталоги на указанном пути
Проверить Пространство имен IO (Каталог, Дорожка), Я думаю, что они помогут вам
using System.IO
Затем проверьте это ..
string fileName =@"d:/root/test/thing1/thing2/file.txt";
string directory = Path.GetDirectoryName(fileName);
if (!Directory.Exists(directory))
Directory.CreateDirectory(directory);
string filename = "c:\\temp\\wibble\\wobble\\file.txt";
string dir = Path.GetDirectoryName(filename);
if (!Directory.Exists(dir))
{
Directory.CreateDirectory(dir);
}
File.Create(filename);
с подходящей обработкой исключения, конечно.
Я нашел установку «местоположения по умолчанию» в начале выполнения, чтобы быть полезным и уменьшить немного избыточного кода (например, Path.Combine(defaultLocation, relativePath)
).
Пример:
var defaultLocation = "z:/";
Directory.SetCurrentDirectory(defaultLocation);
Directory.SetCurrentDirectory(AppContext.BaseDirectory);