2014-12-29 6 views
2

У меня есть следующий фрагмент кода в моем приложении:Directory.Exists разумный для времени?

if (!Directory.Exists(myPath)) 
    Directory.CreateDirectory(myPath); 

Если я запустить его в тестовом модуле регулярно иногда она проходит, иногда нет. Каталог всегда есть (я убедился в этом, поэтому технически он никогда не будет «создан» кодом). Но время от времени Directory.Exists(myPath) вернул false, что заставляет код попытаться создать папку, а затем я получаю UnauthorizedAccessException!

Забавно, если я поставил точку останова на CreateDirectory, а затем переместил желтую стрелку вверх, чтобы проверить, тест возвращает true!

Что происходит?

myPath является \\nameOfLocalMachine\sharedFolder. Доля надежна и постоянно используется ... .NET 4.0

Я только что сделал скрипач, имитирую 3000 запросов последовательных запросов. 175 не удалось ... Все с тем же сообщением:

доступ к пути '\ nameOfLocalMachine \ общая_папка \ randomFileName.json' Отказано

+0

У меня есть те же 2 строки в производственном коде. Не наткнулся на это, хотя – Sievajet

+0

что такое 'myPath'? –

+0

Какая версия Windows, .NET, и путь к локальному, UNC или сопоставленному диску? – David

ответ

3

Этот казус довольно нормально на Windows. Программы открывают дескриптор в каталоге, подобном этому, и указывают удалить общий доступ. Это позволяет кому-либо удалять каталог, даже если программа использует его. Справочник фактически не исчезнет из файловой системы, пока этот дескриптор не будет закрыт. Далее следует, что попытка воссоздать этот каталог не может работать, он все еще существует. Windows генерирует ошибку «отказ в доступе», указанную в вашей программе на C# с помощью UnauthorizedAccessException.

Хотя это звучит как неясная особенность, каждая программа в Windows делает это. Каждый процесс имеет рабочий каталог по умолчанию, значение Environment.CurrentDirectory. Создание дескриптора в таком каталоге гарантирует, что он не может исчезнуть во время использования программы. Есть и другие случаи, например, FileSystemWatcher. Или программа занята итерированием каталога. Индексы защиты от вредоносных программ и поиска, как известно, трудно диагностировать источники таких ошибок.

В противном случае это стандартная опасность для многозадачной операционной системы. Вы не единственный, кто использует файловую систему. Не повторное удаление и создание одного и того же каталога должно быть очень высоким в вашем списке. Если это абсолютно необходимо, то переименуйте в каталог прежде, чем вы его удалите. Вам все равно не удастся удалить переименованный каталог, но вы не сможете его воссоздать. Вы можете удалить его позже, в следующий раз, когда вам нужно это сделать. Тогда гораздо меньше шансов на неприятности. Потому что прошло больше времени.

Смежные вопросы