UnauthorizedAccessException в Vista из-за частого файлового ввода-вывода с .Net 2.0

На работе мы перешли с 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 пытались получить доступ к целевому файлу во время выполнения моего кода, как было предложено Мартином.

Еще раз спасибо.


person Jeras    schedule 04.05.2009    source источник


Ответы (3)


Есть ли у вас антивирусные сканеры? Попробуйте отключить их или наблюдайте за действиями файлов с помощью ProcMon с http://www.sysinternals.com

person Christian    schedule 04.05.2009

В перспективе перейдите в Performace Monitor (controlpanrl-> Administrative tools) и просмотрите виртуальные байты (на предмет утечек памяти) для вашего приложения во время его работы. Монитор производительности дает вам много подробностей о процессе, который вы хотите исследовать. Я подозреваю, что ваше приложение не освобождает ресурсы, так как оно сильно работает с файловой системой.

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

person Syam    schedule 05.05.2009

Могло ли оно иногда конфликтовать с фоновой службой, такой как индексация файлов? Попробуйте отключить как можно больше этих служб.

person Martin    schedule 05.05.2009