Возможное исключение 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 может быть достаточно, чтобы все прошло гладко. Если это так, то мои предположения будут такими же, как у Ямена.