Невозможно удалить каталог и файлы, используя C # - PullRequest
0 голосов
/ 28 июля 2011

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

Когда пользователь нажимает кнопку «Установить», программа установки запрашивает UAC. При выборе Да установщик вызовет метод для удаления существующих файлов и папок. Но он не может удалить файлы и папки. Я использую код DI.Delete (путь). Это дает эту ошибку

Access to the path 'CodeCreate.aspx' is denied.
   at System.IO.Directory.DeleteHelper(String fullPath, String userPath, Boolean recursive)
   at System.IO.Directory.Delete(String fullPath, String userPath, Boolean recursive)
   at System.IO.DirectoryInfo.Delete(Boolean recursive)
   at CustomizationCA.CustomActions.DeleteExistingFilesAndFolder(Session session)

Если я запускаю командную строку от имени администратора и затем использую команду «msiexec / i Setup.msi», она удаляет эти файлы и папку.

А при использовании Directory.Delete (путь, истина); Я получаю это как исключение

Exception thrown by custom action:
System.Reflection.TargetInvocationException: Exception has been thrown by the target of an invocation. ---> System.Security.SecurityException: The source was not found, but some or all event logs could not be searched.  Inaccessible logs: Security.
   at System.Diagnostics.EventLog.FindSourceRegistration(String source, String machineName, Boolean readOnly)
   at System.Diagnostics.EventLog.SourceExists(String source, String machineName)
   at System.Diagnostics.EventLog.VerifyAndCreateSource(String sourceName, String currentMachineName)
   at System.Diagnostics.EventLog.WriteEntry(String message, EventLogEntryType type, Int32 eventID, Int16 category, Byte rawData)
   at System.Diagnostics.EventLog.WriteEntry(String source, String message, EventLogEntryType type, Int32 eventID, Int16 category, Byte rawData)
   at System.Diagnostics.EventLog.WriteEntry(String source, String message)
   at CustomizationCA.CustomActions.DeleteExistingFilesAndFolder(Session session)

Я использую инструмент WIX для создания установщика.

Если перейти к свойствам определенного файла, а затем дать полное разрешение всем пользователям, а затем попытаться удалить файл, файл будет удален. enter image description here

Ответы [ 3 ]

4 голосов
/ 28 июля 2011

Проверьте, доступна ли папка или файл только для чтения. Сначала приведите файлы в нормальное состояние.

Используйте этот код перед удалением любого файла в вашем каталоге

File.SetAttribute(path, FileAttributes.Normal);
File.Delete(path);
2 голосов
/ 28 июля 2011

Настраиваемое действие, которое вы используете для удаления файлов, должно быть отложено для настраиваемого действия и должно иметь флаг олицетворения «Нет». В противном случае настраиваемое действие запускается с правами пользователя, запустившего установку MSI, без применения повышения прав.


Лучше использовать элемент RemoveFolderEx в WiX для обработки удаления файлов, а не пользовательское действие.

0 голосов
/ 28 июля 2011

Я не уверен, что понимаю вас.Вы создали установщик, и он удаляет некоторые файлы.Когда установщик запускается, он запрашивает UAC.И, удалив файлы, вы получите SecurityException.

Вы уверены, что Пользователь, который запускает установщик, имеет право удалить файл.Если у него нет такого разрешения, оно не может работать, это логично.И вы сказали, что это работает, если вы даете пользователю полный контроль.

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

(В разделе «Специальные разрешения» вы найдете разрешение «удалить»)

...