无法使用C#删除目录和文件

时间:2011-07-28 05:01:02

标签: c# directory wix installer wix3.5

我已经创建了安装程序,如果它们已经存在,则需要删除一些文件和文件夹,并替换为新文件和文件夹。

当用户点击安装时,安装程​​序会提示输入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(path,true)时;我将此作为例外

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 个答案:

答案 0 :(得分:4)

检查文件夹或文件是否为只读。首先将文件置于正常状态。

在删除目录中任意和所有文件之前使用此代码

File.SetAttribute(path, FileAttributes.Normal);
File.Delete(path);

答案 1 :(得分:2)

用于删除文件的自定义操作必须是延迟自定义操作,并且必须将impersonate标志设置为“no”。否则,自定义操作将使用启动MSI安装的用户的权限运行,而不应用高程。


最好考虑在WiX中使用RemoveFolderEx元素来处理文件删除而不是自定义操作。

答案 2 :(得分:0)

我不确定我是否理解你。您创建了一个安装程序并删除了一些文件。安装程序启动时会提示输入UAC。通过删除文件,您将获得SecurityException

您确定执行安装程序的用户是否具有删除文件的权限。 如果他没有这个许可它就行不通,这是合乎逻辑的。并且你说如果你给用户全面控制它是有效的。

如果您希望它有效,您必须授予用户删除这些文件的权限。

(在特殊权限下,您会找到“删除”权限)