На работе мы перешли с Windows XP на Windows Vista. После миграции некоторые из моих модульных тестов, использующих nUnit, начали случайным образом давать сбой с генерированием исключения System.UnauthorizedAccessException. Каждый неудачный тест включает запись файлов, используемых для тестов, хранящихся в качестве встроенных ресурсов в тестовой DLL, в текущий каталог, запуск тестов, а затем их удаление, как правило, при установке / разборке или настройке / разборке приспособлений, в быстрой последовательности. Я делаю это для того, чтобы мои тесты не зависели от местоположения на каждом диске разработчика, с которого они запускаются, и не беспокоились об относительных путях к файлам.
При устранении неполадок я обнаружил, что это связано с созданием и удалением файлов. При удалении каждое удаление следует шаблону:
if( File.Exists(path) ) { File.Delete(path) }
Когда я окружаю это блоком try-catch и точкой останова на catch (если было сгенерировано исключение), файл уже был бы удален с диска. Для сбоев при создании файла, обычно с использованием XmlWriter или StreamWriter, каждый указан для перезаписи файла, если он существует.
Странно то, что во время расследования я создал эту программу на C #, которая, кажется, воссоздает исключение:
class Program
{
static void Main(string[] args)
{
int i = 0;
try
{
while (true)
{
System.IO.TextWriter writer = new System.IO.StreamWriter("file.txt");
i++;
System.Console.Out.WriteLine(i);
writer.Write(i);
writer.Close();
System.IO.File.Delete("file.txt");
}
}
catch (System.UnauthorizedAccessException ex)
{
System.Console.Out.WriteLine("Boom at: " + i.ToString());
}
}
}
На одной из наших машин, на которой все еще есть XP, она будет продолжать повторяться до сотен тысяч без исключения, пока я ее не убью. На любом из наших компьютеров Vista он будет печатать «Бум» где-то между 150 и 500 итерациями.
Поскольку у меня нет доступа к машине с Vista вне работы, я не могу определить, связана ли эта конкретная «причуда» с конфигурацией безопасности Vista или самой Vista, установленной моим работодателем.
Достаточно сказать, что я в полном тупике.
РЕДАКТИРОВАТЬ:
Хочу поблагодарить всех за ответы. Я использовал Process Monitor, предложенный Кристианом, и обнаружил, что процессы Windows Vista SearchIndexer и TortoiseSVN TSVNCache пытались получить доступ к целевому файлу во время выполнения моего кода, как было предложено Мартином.
Еще раз спасибо.