На работе мы перешли с Windows XP на Windows Vista. После миграции некоторые из моих модульных тестов, использующих nUnit, начали произвольно завершаться с ошибкой System.UnauthorizedAccessException. Каждый из неудачных тестов включает в себя запись файлов, используемых для тестов, хранящихся в виде встроенных ресурсов в тестовой DLL, в текущий каталог, запуск тестов с последующим их удалением, обычно в setup / teardown или fixture setup / teardown, в быстрой последовательности. Я делаю это так, чтобы мои тесты не зависели от расположения на диске каждого разработчика, с которого они запускались, и не беспокоились об относительных путях к файлам.
При устранении неисправностей я обнаружил, что это связано с созданием и удалением файлов. При удалении каждое удаление следует шаблону:
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 он будет печатать «Boom» в интервале от 150 до 500 итераций.
Поскольку у меня нет доступа к компьютеру с операционной системой Vista вне работы, я не могу определить, является ли этот конкретный «причудой» из-за конфигурации безопасности моего работодателя, Vista или самой Vista.
Достаточно сказать, что я довольно озадачен.
EDIT:
Я хотел бы поблагодарить всех за их ответы. Я использовал Process Monitor, предложенный Кристианом, и обнаружил, что процессы Windows Vista SearchIndexer и TortoiseSVN TSVNCache пытались получить доступ к целевому файлу во время работы моего кода, как предложил Мартин.
Еще раз спасибо.