Это исключение возникает периодически для одного и того же пользователя на одном компьютере при чтении файлов в %LOCALAPPDATA%
.
Research
Я проверил все возможные дубликаты, предлагаемые в настоящее время под этим названием (их много). Есть один, связанный с чтением зашифрованного файла AES , который не имеет ответа; и я не думаю, что это применимо, так как эти файлы не зашифрованы.
Большинство из них связаны с записью файлов (но я читаю файл) или являются очевидными причинами, описанными в MSDN для File.ReadAllBytes (string) .
Существует три объяснения этого исключения:
- «Эта операция не поддерживается на текущей платформе» - я не знаю, что это значит; но учитывая, что это иногда работает для одного и того же пользователя на одной и той же машине (я объясню ниже), я думаю, что могу исключить это.
- " путь указан каталог" - как вы увидите из кода ниже, вызов выполняется с проверкой
File.Exists
, поэтому я думаю, что могу исключить это.
- "У вызывающей стороны нет необходимого разрешения." Это обычное объяснение этого исключения, и я подозреваю, что я получаю какой-то «крайний случай» этого.
Сценарий
Это происходит, когда приложение, работающее в качестве пользователя домена, читает файл в подпапке %LOCALAPPDATA%
того же пользователя (для которого у этого пользователя не должно быть никаких разрешений на чтение файлов). Подпапки внутри этого просто следуют обычной структуре «CompanyName» \ «ApplicationName», и к подпапкам не применяются дополнительные разрешения (мы просто используем папку, чтобы наши файлы не попадали в чужие файлы).
Исключение
System.UnauthorizedAccessException: доступ к пути ' [отредактировано] ' есть
отказано. в System.IO .__ Error.WinIOError (Int32 errorCode, String
MaybeFullPath) в System.IO.FileStream.Init (String path, FileMode
режим, доступ к FileAccess, права Int32, логическое использование прав, FileShare
поделиться, Int32 bufferSize, опции FileOptions, SECURITY_ATTRIBUTES
secAttrs, String msgPath, Boolean bFromProxy, Boolean useLongPath,
Boolean checkHost) в System.IO.FileStream..ctor (String path,
Режим FileMode, доступ к FileAccess, общий доступ к FileShare, размер буфера Int32,
Опции FileOptions, Строка msgPath, Логическое значение bFromProxy, Логическое значение
useLongPath, Boolean checkHost) в
System.IO.File.InternalReadAllBytes (Строковый путь, логический checkHost)
на код ниже
Код
// Note that filename is within %LOCALAPPDATA%
if (File.Exists(fileName))
{
var readAllBytes = File.ReadAllBytes(fileName); // exception here
// etc...
}
Доказательство того, что оно прерывистое
И я могу доказать из комбинации наших журналов ошибок и другой информации, что это работает в большинстве случаев времени, и я могу доказать следующую последовательность событий для конкретной комбинации компьютера и пользователя. :
- Приложение работает, тогда
- Это исключение возникает (возможно, несколько раз, причем задержки повторов экспоненциально увеличиваются каждый раз: 1 минута, 2 минуты, 4 минуты и т. Д.), Затем
- Приложение снова работает
Я не верю, что какие-либо существенные изменения (например, разрешения) произошли в файловой системе для ее исправления. Мне интересно, может ли это быть вызвано проблемой дополнительных прав доступа, например, если срок действия их пароля истекает или он был недавно изменен.
У меня есть конкретный пример, когда я заметил, что эта ошибка произошла, и я посоветовал пользователю перезагрузить компьютер, и проблема исчезла.
Вопрос
Может кто-нибудь дать мне авторитетное объяснение причины этого, сверх того, о чем я уже догадался, или подтвердить, что это такое?