Як створити каталог, якщо він не існує, щоб створити файл?


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, якщо потрібно. Не забудьте перевірити, чи є у вас доступ для створення файлів у цьому місці.

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

Додаткова інформація для базових концепцій вводу / виводу файлів .


Я спочатку неправильно прочитав ваше запитання про те, що ви хотіли написати у файл, який може не існувати. Поняття, по суті, однакові для файлів та каталогів IO, хоча.
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.