2016-09-16 4 views
5

У меня есть установка на C# wpf, выполненная с помощью .net, используя щелчок после установки. Все работает нормально. Тогда у меня есть следующий код, который является частью установленной программы:System.UnauthorizedAccessException: доступ к пути «...» отрицается

String destinationPath = System.Windows.Forms.Application.StartupPath + "\\" + fileName; 
File.Copy(path, destinationPath, true); 
this.DialogResult = true; 
this.Close(); 

Но я получаю эту ошибку:

System.UnauthorizedAccessException: Access to the path C:\user\pc\appdata\local\apps\2.0....... is denied.

at System.IO.File.InternalCopy(String sourceFileName, String destFileName, Boolean overwrite, Boolean checkHost) at System.IO.File.Copy(String sourceFileName, String destFileName, Boolean overwrite)

Является ли это ошибка разрешения или мне нужно настроить что-то в моем коде?

Что заставляет меня задуматься, почему пользователь может установить программу, щелкнув один раз в этом каталоге без каких-либо проблем, но загрузка файла на него не работает?

+0

Какова ваша целевая среда и сколько у вас контроля над ней? Это для организации предприятия или для личного использования? –

+0

Моя цель больше личного использования, но она также может быть на предприятии. – user5313398

+1

Остановите попытку скопировать файлы в папку вашего приложения, эту папку можно заменить, если пользователь исправляет или переустанавливает ваше приложение. Вместо этого используйте 'ApplicationData'. –

ответ

1

Во-первых, если вам нужно написать какие-либо данные, вы должны использовать перечисление Environment.SpecialFolder.

Во-вторых, не пишите в какую-либо папку, где приложение развертывается, потому что оно обычно читается только для приложений. Вероятно, вы захотите записать в нумерации ApplicationData или LocalApplicationData.

+0

@jb Мне нужно загрузить файл лицензии туда, где установлено приложение? Какой лучший способ я могу это сделать? – user5313398

+0

@ user5313398 Это невозможно, если пользователь не может иметь повышенные разрешения –

+0

Но почему это сработало, это много других компьютеров, кроме этого? – user5313398

1

Я думаю, что доступ к% appdata% ограничен по умолчанию для окон 8 (или 7) и далее. Когда приложение установлено через ClickOnce, вам, вероятно, будет предложено дать ему разрешение на изменение этого компьютера - это правильно?

Вы можете попробовать запустить приложение с полномочиями администратора в качестве теста (сместить сдвиг, щелкнуть правой кнопкой мыши .exe, запустить как администратор), который, вероятно, решит его, но это не идеальный способ сделать это.

Вместо этого попробуйте другую папку, что-то вроде:

Environment.GetFolderPath(Environment.SpecialFolder.ApplicationData) 

или

Environment.GetFolderPath(Environment.SpecialFolder.MyDocuments) 

, который должен дать вам больше повезёт.

Как примечание стороны - если вы строите пути в коде, а не с помощью

path + "\\" + path + "\\" + filename 

, который может привести к неудачам (путь, возможно, уже есть \ на конце), то, как правило, лучше использовать Path .Combine (..)

String destinationPath = Path.Combine(Environment.GetFolderPath(Environment.SpecialFolder.ApplicationData), fileName); 

Удачи вам!

+0

Мне нужно загрузить файл лицензии туда, где установлено приложение? Какой лучший способ я могу это сделать? – user5313398

6

При установке приложения установщик обычно запрашивает административные привилегии. Если пользователь выбирает «Да», программа будет работать и иметь доступ на чтение и запись к большему разнообразию путей, чем обычный пользователь. Если случай таков, что установщик не запрашивал административные привилегии, возможно, просто ClickOnce автоматически запускается под каким-то повышенным привилегиями.

Я бы предложил вам написать в локальную папку appdata, но если вы чувствуете, что действительно хотите писать в тот же каталог, что и ваше приложение, вы должны сначала запустить приложение с правами администратора.

Для того, чтобы ваше приложение всегда просят привилегий администратора вы можете изменить файл манифеста вашего приложения и установить requestedExecutionLevel тега level атрибут requireAdministrator:

<requestedExecutionLevel level="requireAdministrator" uiAccess="false" /> 

Вы можете прочитать немного больше в How do I force my .NET application to run as administrator?

+0

@VisualVicent то, что я выбрал Clickonce, потому что он не нуждается в дополнительных настройках прав прямо? Он работает на многих других компьютерах, за исключением того, что он дает мне вопрос. Хорошо, я следил за вашей ссылкой, и в настоящее время я добавил новый файл манифеста, и текущие настройки - это , поэтому я просто изменяю это на user5313398

+0

@ user5313398: 'именно то, что я выбираю Clickonce, потому что он не нуждается в дополнительных настройках прав?' - Я не очень хорошо знаком с ClickOnce, но ваше приложение, скорее всего, не будет работать под теми же привилегиями, что и ClickOnce установщик. Это было бы идиотским Microsoft, потому что кто знает, какие привилегии вы хотите для своего приложения? –

+0

@ user5313398: Да, вы просто изменяете уже существующий тег 'requestExecutionLevel'. –

1

I была запущена программа, которая будет генерировать файл. Целевая папка была только для чтения. И это сбой с ошибкой. Удаление атрибута «только для чтения» с использованием свойств папки разрешило ошибку. Надеюсь это поможет.

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