Возможное исключение 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 эта функция в конечном итоге выдает исключение (когда i больше 100000):

        Unhandled Exception: System.UnauthorizedAccessException: Access to the path 'D:\... \Temp\sample.txt' is denied.
       at System.IO.__Error.WinIOError(Int32 errorCode, String maybeFullPath)
       at System.IO.FileStream.Init(String path, FileMode mode, FileAccess access, Int32 rights,
     Boolean useRights, FileShare share, Int32 bufferSize, FileOptions options, SECURITY_ATTRIBU
    TES secAttrs, String msgPath, Boolean bFromProxy)
       at System.IO.FileStream..ctor(String path, FileMode mode, FileAccess access, FileShare sh
    are, Int32 bufferSize, FileOptions options)
       at System.IO.File.Create(String path)
       at Exceptions.Program.DirTest() in D:\Exceptions\Program.cs:line 118
       at Exceptions.Program.Main(String[] args) in D:\Exceptions\Program.cs:
    line 167

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

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

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

Спасибо!


person whywhywhy    schedule 12.04.2012    source источник
comment
Почему вы так делаете?   -  person ABH    schedule 12.04.2012
comment
Это вполне может быть проблема с базовыми драйверами диска или самой NTFS и не имеет ничего общего с .NET. Создание и удаление каталога и файла более чем в 100 000 раз быстрее, чем вы можете, вряд ли будет полезно для ОС, диска или вашей программы. Как говорит @hamad, и ваше имя пользователя тоже просит об этом, почему почему?   -  person yamen    schedule 12.04.2012
comment
Мои деньги связаны с контролем учетных записей пользователей (UAC), который здесь является проблемой. Вы пробовали запустить прогу с повышенными правами администратора?   -  person Bridge    schedule 12.04.2012
comment
Возможно, вы ищете это: ‹stackoverflow.com/questions/8821410/  -  person sarwar026    schedule 12.04.2012
comment
hamad, yamen - Причина, по которой я написал этот тест, заключается в том, что я работаю над программным обеспечением, которое выполняет что-то подобное 24/7, но не в той же папке, а в огромных общих файловых ресурсах.   -  person whywhywhy    schedule 12.04.2012
comment
sarwar026 - Другой вопрос, который вы задаете каждый раз, - это сбой. В моем случае это провал после 100000 успехов.   -  person whywhywhy    schedule 12.04.2012
comment
Мост - как я уже упоминал в другом комментарии, он преуспевает 100000 раз, прежде чем потерпит неудачу. Если это проблема UAC, это должно происходить каждый раз. Программа уже запущена в консоли администратора запуска от имени.   -  person whywhywhy    schedule 12.04.2012


Ответы (2)


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

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

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

Надеюсь, этот ответ может помочь;)

person sebastianmehler    schedule 12.04.2012
comment
Если я использую procmon для отслеживания всех событий и процессов, которые обращаются к папке, в которой создается и удаляется Temp \ sample.txt, я вижу, что кроме тестового приложения никакие другие процессы не обращаются к пути. Даже после исключения в procmon нет других процессов. Так что я не могу доказать, что это вина антивируса. - person whywhywhy; 12.04.2012

@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;
    }
}

Я прошел 200 000 итераций без проблем. Я даже закомментировал строку записи в цикле, чтобы она работала быстрее, без проблем.

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

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

person James Oravec    schedule 18.05.2012