C#winform在卸载时删除文件夹和文件。权限错误

时间:2012-05-14 08:16:33

标签: c#

我收到以下错误。

我需要卸载应用程序并删除程序文件/ myapp中由应用程序或用户创建的所有文件和文件夹。

如何解决此问题? 感谢。

Access to the path 'C:\Program Files (x86)\DefaultProgram\Application\app.exe' is denied.

我的代码:

protected override void OnAfterUninstall(IDictionary savedState)
        {
            string sFolder = Path.GetDirectoryName(Context.Parameters["assemblypath"]);
            string sUsername = "NT AUTHORITY\\LOCALSERVICE";
            DirectoryInfo myDirectoryInfo = new DirectoryInfo(sFolder);
            DirectorySecurity myDirectorySecurity = myDirectoryInfo.GetAccessControl();
            myDirectorySecurity.AddAccessRule(
                new FileSystemAccessRule(
                    sUsername, FileSystemRights.Read | 
                    FileSystemRights.Write | 
                    FileSystemRights.Modify, InheritanceFlags.ContainerInherit | 
                    InheritanceFlags.ObjectInherit, PropagationFlags.InheritOnly, AccessControlType.Allow));
            myDirectoryInfo.SetAccessControl(myDirectorySecurity);
            base.OnAfterUninstall(savedState);
            string appPath = Path.GetDirectoryName(Assembly.GetExecutingAssembly().Location);
            DeleteDirectory(Path.Combine(appPath, "DB"));
            DeleteDirectory(appPath);
        }

        public static void DeleteDirectory(string target_dir)
        {
            string[] files = Directory.GetFiles(target_dir);
            string[] dirs = Directory.GetDirectories(target_dir);
            foreach (string file in files)
            {
                File.SetAttributes(file, FileAttributes.Normal);
                File.Delete(file);
            }
            foreach (string dir in dirs)
            {
                DeleteDirectory(dir);
            }
            Directory.Delete(target_dir, false);
        } 

3 个答案:

答案 0 :(得分:2)

您的主要问题是Windows Vista和更高版本的Windows版本中的UAC!

您的代码将在XP中正确运行,但会在Vista或7或8中产生复杂性。

请参阅答案Here以管理员身份运行您的应用程序!

答案 1 :(得分:1)

您可以在XP上以这种方式删除您的app.exe

Process.Start("cmd.exe", "/C ping 1.1.1.1 -n 1 -w 3000 > Nul & Del " + 
      Application.ExecutablePath); 
Application.Exit();

或Win7中的此内容( EDIT2

Process.Start("cmd.exe", "timeout 5 > Nul & Del " + 
      Application.ExecutablePath); 
Application.Exit();

但您必须添加foreach if(file.Contains("app.exe")) continue;

修改

protected override void OnAfterUninstall(IDictionary savedState)
    {
        base.OnAfterUninstall(savedState);
        string sFolder = Path.GetDirectoryName(Context.Parameters["assemblypath"]);
        string sUsername = "NT AUTHORITY\\LOCALSERVICE";
        DirectoryInfo myDirectoryInfo = new DirectoryInfo(sFolder);
        DirectorySecurity myDirectorySecurity = myDirectoryInfo.GetAccessControl();
        myDirectorySecurity.AddAccessRule(
            new FileSystemAccessRule(
                sUsername, FileSystemRights.Read | 
                FileSystemRights.Write | 
                FileSystemRights.Modify, InheritanceFlags.ContainerInherit | 
                InheritanceFlags.ObjectInherit, PropagationFlags.InheritOnly, AccessControlType.Allow));
        myDirectoryInfo.SetAccessControl(myDirectorySecurity);
        string appPath = Path.GetDirectoryName(Assembly.GetExecutingAssembly().Location);
       DeleteDirectory(Path.Combine(appPath, "DB"));
        DeleteDirectory(appPath);
    }

    public static void DeleteDirectory(string target_dir)
    {
        string[] files = Directory.GetFiles(target_dir);
        string[] dirs = Directory.GetDirectories(target_dir);
        foreach (string file in files)
        {
            File.SetAttributes(file, FileAttributes.Normal);
            if(file.Contains("app.exe")) continue;
            File.Delete(file);
        }
        foreach (string dir in dirs)
        {
            DeleteDirectory(dir);
        }
        Directory.Delete(target_dir, false);
    } 

答案 2 :(得分:1)

您的问题与安全性有关,例如在Windows XP中它可能有效,但在Windows 7中它可能会失败,您将被拒绝操作文件。

为了解决这个问题,你需要确保以下几点:

  1. 打包和部署项目输出两个文件:.msi& .EXE。

    .MSI文件 - 允许在某种预定义下执行 特别是对于安装程序权限 - 这意味着它可能不会 有足够的权限从你想要的任何文件夹中删除文件 - 它 只能添加或删除目标应用程序文件夹中的文件。

    .Exe文件 - 几乎和MSI文件一样,它实际上被设置为执行msi 文件。然而..因为它是Exe文件,你可以设置一个标志来指示它必须执行 在管理员权限下,这将允许您实现您的目标。 (.exe可能包含您可能需要部署的其他内容,例如.net包或directX)

  2. 因为这种情况非常不方便,因为你被迫推动为你的用户提供这两个文件而且他们不知道要执行什么。 我建议您使用WINRAR将这两个文件存档到RAR自己 提取档案。您可以设置RAR存档以管理员权限执行存档的.EXE文件,并设置RAR-sfx存档本身(也是.exe) 标志“需要管理员权限”。