UnauthorizedAccessException в Vista из-за частых файловых операций ввода-вывода с .Net 2.0 - PullRequest
4 голосов
/ 05 мая 2009

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

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

Ответы [ 3 ]

1 голос
/ 05 мая 2009

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

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

1 голос
/ 05 мая 2009

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

0 голосов
/ 05 мая 2009

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

...