2016-08-09 3 views
-1

Интересно, есть ли у кого-нибудь подобная проблема.File.Copy throws UnauthorizedAccessException

У меня есть простой код копирования файлов в моем приложении, который можно упростить, как показано ниже (и мой пользователь, которого я открыл VS2013 для отладки кода, имеет полный контроль над иерархией исходных и целевых папок - это было не так для какой-то причине, я попытался запустить VS в режиме администратора, который не работает, то я вручную применяется полный контроль для пользователя, и в любом случае ошибка жалуется на исходную папку)

// sourcefile was thought to be @"C:\tfs\Dev\Source\some-module\bin\Debug\mybinary.dll"; 
// retrieved through an environment variable, but was pointing to the folder instead of the file inside 
Directory.CreateDirectory(myfolder); 
File.Copy(sourcefile, Path.Combine(myfolder, Path.GetFileName(sourcefile)), true); 

Этот код работал счастливо до I попробовал это сегодня на моей локальной машине (и все еще работает на моей тестовой машине). Но по какой-то причине, он начал бросать ошибку ниже:

System.UnauthorizedAccessException: Access to the path 'C:\tfs\Dev\Source\some-module\bin\Debug' is denied. 
Result StackTrace: 
at System.IO.__Error.WinIOError(Int32 errorCode, String maybeFullPath) 
    at System.IO.File.InternalCopy(String sourceFileName, String destFileName, Boolean overwrite, Boolean checkHost) 
    at System.IO.File.Copy(String sourceFileName, String destFileName, Boolean overwrite) 

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

Папка для источника имеет атрибут только для чтения и думает, что это может быть проблемой (что странно), я начал пытаться отключить его, но не могу. Затем я переместил папку из рабочей области tfs в другую папку (в разделе c: \ users \ my-user ..) и по-прежнему не может удалить атрибут только для чтения (кажется, он работает, но проверка снова показывает тот же атрибут на файл). Я даже отчаянно пытался отключить чтение только для всех родительских папок, а затем сдался, как в венах. И никоим образом не должно быть связано с исходной проблемой.

Я дважды проверял подобные вопросы и мысли, и у меня заканчиваются варианты.

Win7, .net 4.5.2, VS2013 - это некоторые конфигурации.

дополнительные эксперименты, обновить Я попытался с помощью Directory.CreateDirectory на каталоге Исходный_файла с правилами безопасности с полным разрешения на текущий пользователь, ничего не меняет. Зачем ему жаловаться на каталог исходного файла, чтобы начать с?

+5

Это означает, что текущий пользователь не имеет права на запись в этом каталоге. Сначала установите разрешение учетной записи пользователя, на которой выполняется приложение. –

+1

Предложения: a) Файл проверки не существует в пункте назначения; b) отскакивать одну секунду и повторять попытку, поскольку AV может сканировать файл и временный доступ к блокировке. –

+0

Ниранджан. В первом абзаце я упомянул о полном контроле пользователя. Хорхе, хорошая идея об AV, я проверю! – MattAPiroglu

ответ

0

Хм. Это случилось снова. Ошибка в другом месте.

Упрощенный код, который я поставил в вопросе, не показывал фактического. Я использовал переменную среды для имени исходного файла, и оказалось, что она указывает на папку, а не на файл.

Я думаю, что проблема здесь в UnauthorizedAccess от Microsoft не достаточно интуитивно понятна, чтобы понять, что вы на самом деле пытались скопировать каталог, а не в файл, и вы начинаете преследовать свой хвост в результате. В любом случае, вот случай, который может помочь кому-то другому. Не забудьте проверить, является ли это папкой или файлом, который вы копируете.

0

Может быть, файл заблокирован? Если он загружен из Интернета, Windows заблокирует его. Затем вам нужно перейти к свойствам файла, а внизу вы найдете флажок, где вы можете разблокировать его.

Blocked file

+0

Спасибо за ответ, но я уже указал, где я ошибся в своем обновлении. Очень хорошая точка, кстати. – MattAPiroglu

Смежные вопросы