Directory.CreateDirectory Проблема с задержкой? - PullRequest
10 голосов
/ 09 февраля 2010

Я пытаюсь создать удаленный каталог, а затем записать в него файл. Каждое замечательное время от времени приложение завершается с ошибкой System.IO.DirectoryNotFoundException при попытке записать файл.

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

Есть ли вероятность, что я пытаюсь записать в каталог до того, как Windows закончит его создание? Я думаю, что Directory.CreateDirectory не вернется, пока эта задача не будет завершена.

Ответы [ 3 ]

8 голосов
/ 09 февраля 2010

Ответ - Да. Поведение, когда создание файла / каталога запаздывает, ожидается. Обычное решение, предложенное другим комментатором, заключается в использовании повторных попыток с некоторым таймаутом. Поведение одинаково для всех используемых файловых функций: Findfirst, CreateFile, WaitForSingleObject и т. Д.

Другим решением будет использование новых транзакционных функций API, имеющихся в Vista и более поздних версиях ОС Windows.

Проблема неприятна и никогда не понималась разработчиками проектов с интенсивным использованием файлов, созданных на других платформах и перенесенных в Windows: например, скрипты DOS / CMD, клиенты SVN, Cygwin, perl, различные приложения Java, различные установщики и т. Д. *

6 голосов
/ 06 февраля 2015

У меня просто была эта проблема, и для меня ситуация была такой:

if(!exportDirectory.Exists)
    exportDirectory.Create();

Затем, когда в другом классе, которому передан этот такой же объект DirectoryInfo, я делаю:

if (!exportDirectory.Exists)
    throw new DirectoryNotFoundException(exportDirectory.FullName);

И каталог, по-видимому, все еще не существует (хотя у меня есть родительский каталог, открытый в Windows, и, конечно, я вижу его прямо перед собой)

Решение, которое я нашел, заключается в том, что после первоначального создания каталога я должен вызывать:

exportDirectory.Refresh();

От Microsoft:

Обновляет состояние объекта. (Унаследовано от FileSystemInfo.)

4 голосов
/ 09 февраля 2010

Хотя я никогда не сталкивался с таким поведением и не могу объяснить его, прагматичным решением является настройка цикла вокруг вашего вызова для доступа к каталогу. Перехватите DirectoryNotFoundException внутри этого цикла и повторите попытку несколько раз после короткой паузы каждый раз. Повторите исключение, если число повторов превышено.

Добавление подробного журнала в этот момент может помочь вам определить фактическую причину проблемы.

...