Возможное исключение System.UnauthorizedAccessException: доступ к пути... запрещен

У меня есть простая консольная программа на C#, которая вызывает функцию, показанную ниже:

static void DirTest()
{
    string dir = "Temp";
    for (int i = 0; i < int.MaxValue; i++)
    {
        if (!Directory.Exists(dir))
        {
            Directory.CreateDirectory(dir);
        }
        string file = Path.Combine(dir, "sample.txt");
        File.Create(file).Close();
        File.Delete(file);
        Directory.Delete(dir);
    }
}

На некоторых машинах Win 7 эта функция в конечном итоге выдает исключение (когда я больше 100 000):

        Необработанное исключение: System.UnauthorizedAccessException: доступ к пути "D:\... \Temp\sample.txt" запрещен.
       в System.IO.__Error.WinIOError(Int32 errorCode, String MaybeFullPath)
       в System.IO.FileStream.Init(путь строки, режим FileMode, доступ к FileAccess, права Int32,
     Логические useRights, FileShare share, Int32 bufferSize, опции FileOptions, SECURITY_ATTRIBU
    TES secAttrs, String msgPath, Boolean bFromProxy)
       в System.IO.FileStream..ctor(Строковый путь, режим FileMode, доступ к FileAccess, FileShare sh
    есть, Int32 bufferSize, параметры FileOptions)
       в System.IO.File.Create(String path)
       в Exceptions.Program.DirTest() в D:\Exceptions\Program.cs: строка 118
       в Exceptions.Program.Main(String[] args) в D:\Exceptions\Program.cs:
    линия 167

На этих машинах установлены агент McAfee и агент безопасности Cisco, а также множество других программ. Защитник Windows отключен. Программа работает в консоли администратора. Программа скомпилирована для.net 3.5. Этого я не видел на машинах W2k3 или XP.

Если я использую procmon для мониторинга всех событий и процессов, которые обращаются к папке, где создается и удаляется "Temp\sample.txt", я вижу, что кроме тестового приложения другие процессы не обращаются к пути. Даже после исключения другие процессы не перечислены в procmon. Поэтому я не могу доказать, что это вина антивируса.

У кого-нибудь есть идеи, что может быть не так? Я поймал ошибку в.net на Win7;)

Спасибо!

2 ответа

Код работает на моем Maschine Windows 7 / 64 Bit

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

У меня работает McAffee, но нет Cisco..

Надеюсь, что этот ответ может быть полезным;)

@whywhywhy

Я немного изменил ваш код, чтобы посмотреть, смогу ли я получить немного больше информации, если это приведет к ошибке на моем конце.

static void DirTest()
{
    string dir = "Temp";
    int i = 0;
    try
    {
        for (i = 0; i < int.MaxValue; i++)
        {
            if (!Directory.Exists(dir))
            {
                Directory.CreateDirectory(dir);
            }
            string file = Path.Combine(dir, "sample.txt");
            File.Create(file).Close();
            File.Delete(file);
            Directory.Delete(dir);
            System.Console.WriteLine("Finished i: " + i);
        }
    }
    catch
    {
        System.Console.WriteLine("Error on i: " + i);
        throw;
    }
}

Я прошел 200000 итераций без проблем. Я даже прокомментировал запись в цикле, которая заставила бы его работать быстрее, все еще без проблем.

Я не уверен, какую версию Visual Studio вы используете, но вы можете попробовать пару вещей: 1) Проверьте наличие обновлений для VS и Windows. 2) Проверьте наличие обновлений драйверов для вашего жесткого диска.

Возможно, вы также можете запустить измененный код с оператором print... чтобы увидеть, не является ли это проблемой синхронизации. Оператора print может быть достаточно, чтобы все прошло гладко. Если это так, то мои предположения будут такими же, как у Ямена.

Другие вопросы по тегам