Как мне создать каталог, если он не существует для создания файла?


202

У меня есть фрагмент кода, который ломается, если каталог не существует:

System.IO.File.WriteAllText(filePath, content);

Можно ли в одной строке (или нескольких строках) проверить, не существует ли каталог, ведущий к новому файлу, и, если нет, создать его, прежде чем создавать новый файл?

Я использую .NET 3.5.



@TimSchmelter, «Возможный дубликат» - это способ очистки - закрыть похожие вопросы и оставить один с лучшими ответами. Дата не обязательна. См. Meta.stackexchange.com/questions/147643/… Если вы согласны с тем, что требуется уточнение, проголосуйте по адресу meta.stackexchange.com/questions/281980/…
Майкл Фрейдгейм

Ответы:


394

Создавать

(new FileInfo(filePath)).Directory.Create() Перед записью в файл.

.... Или, если он существует, то создай (иначе ничего не делай)

System.IO.FileInfo file = new System.IO.FileInfo(filePath);
file.Directory.Create(); // If the directory already exists, this method does nothing.
System.IO.File.WriteAllText(file.FullName, content);

5
Элегантное решение, поскольку оно обрабатывает ситуации, которые требуют создания вложенных папок.
Денни Джейкоб

Спасибо! Я видел stackoverflow.com/questions/9065598 , но я хотел начать с абсолютного пути к файлу и не хотел иметь дело с разбиением пути. Теперь я знаю, что вы можете получить доступ к каталогу из экземпляра FileInfo.
Иоганн

Есть ли асинхронный способ сделать это?
Джо Филлипс

1
Я полагаю, вы могли бы сделать это с Task.Run(() => );.
Дон

107

Вы можете использовать следующий код

  DirectoryInfo di = Directory.CreateDirectory(path);

41
Directory.CreateDirectoryделает именно то, что вы хотите: он создает каталог, если он еще не существует. Там нет необходимости делать явную проверку в первую очередь .
Паоло Моретти

13
Выдает IOException, если pathэто файл, а не каталог. msdn.microsoft.com/en-us/library/54a0at6s(v=vs.110).aspx
scaryman

34

Как сказал @hitec, вы должны быть уверены, что у вас есть нужные разрешения, если вы это сделаете, вы можете использовать эту строку для обеспечения существования каталога:

Directory.CreateDirectory(Path.GetDirectoryName(filePath))


0

Элегантный способ переместить ваш файл в несуществующий каталог - создать следующее расширение для собственного класса FileInfo:

public static class FileInfoExtension
{
    //second parameter is need to avoid collision with native MoveTo
    public static void MoveTo(this FileInfo file, string destination, bool autoCreateDirectory) { 

        if (autoCreateDirectory)
        {
            var destinationDirectory = new DirectoryInfo(Path.GetDirectoryName(destination));

            if (!destinationDirectory.Exists)
                destinationDirectory.Create();
        }

        file.MoveTo(destination);
    }
}

Тогда используйте новое расширение MoveTo:

 using <namespace of FileInfoExtension>;
 ...
 new FileInfo("some path")
     .MoveTo("target path",true);

Проверка методов расширения документации .


-1

Вы можете использовать File.Exists, чтобы проверить, существует ли файл, и создать его, используя File.Create, если требуется. Обязательно проверьте, есть ли у вас доступ для создания файлов в этом месте.

Если вы уверены, что файл существует, вы можете написать в него безопасно. Хотя в качестве меры предосторожности вы должны поместить свой код в блок try ... catch и перехватить исключения, которые может вызвать функция, если все пойдет не так, как планировалось.

Дополнительная информация для основных концепций файлового ввода / вывода .


Сначала я неправильно прочитал ваш вопрос о том, что вы хотите записать в файл, который может не существовать. Тем не менее, концепции для ввода-вывода файлов и каталогов практически одинаковы.
Hitec

-2

var filePath = context.Server.MapPath(Convert.ToString(ConfigurationManager.AppSettings["ErrorLogFile"]));

var file = new FileInfo(filePath);

file.Directory.Create(); Если каталог уже существует, этот метод ничего не делает.

var sw = new StreamWriter(filePath, true);

sw.WriteLine(Enter your message here);

sw.Close();

Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.