3

アンインストール時に、ディレクトリを削除しようとすると IOException が発生します。「ディレクトリは空ではありません」。以下にリストされているさまざまな方法を試しましたが、何も機能しません。残された (そして削除できない) ファイルには、別の所有者がいます。削除できるファイルの所有者は「SYSTEM」です。例外をスローするファイルの所有者は 'Administrators(PC_Name\Administrators)' 'System' ファイルは installshield インストーラー (MSI) によって書き込まれますが、他のファイルは自分のアプリによって書き込まれ、installshield によって起動され、管理者に昇格されます ...

このフォルダ/ファイルを強制的に削除するにはどうすればよいですか?

    //http://stackoverflow.com/questions/329355/cannot-delete-directory-with-directory-deletepath-true
    public static bool DeleteDirectory(string target_dir)
    {
        bool result = false;

        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);

        return result;
    }

    //http://stackoverflow.com/questions/611921/how-do-i-delete-a-directory-with-read-only-files-in-c
    private static void DeleteFileSystemInfo(FileSystemInfo fsi) 
    { 
        fsi.Attributes = FileAttributes.Normal; 
        var di = fsi as DirectoryInfo; 
        if (di != null) 
        { 
            foreach (var dirInfo in di.GetFileSystemInfos())             
                DeleteFileSystemInfo(dirInfo); } 

        fsi.Delete(); 
    }

    //http://stackoverflow.com/questions/611921/how-do-i-delete-a-directory-with-read-only-files-in-c
    public static void ForceDeleteDirectory(string path)
    {
        DirectoryInfo root;
        Stack<DirectoryInfo> fols;
        DirectoryInfo fol;
        fols = new Stack<DirectoryInfo>();
        root = new DirectoryInfo(path);
        fols.Push(root);
        while (fols.Count > 0)
        {
            fol = fols.Pop();
            fol.Attributes = fol.Attributes & ~(FileAttributes.Archive | FileAttributes.ReadOnly | FileAttributes.Hidden);
            foreach (DirectoryInfo d in fol.GetDirectories())
            {
                fols.Push(d);
            }
            foreach (FileInfo f in fol.GetFiles())
            {
                f.Attributes = f.Attributes & ~(FileAttributes.Archive | FileAttributes.ReadOnly | FileAttributes.Hidden);
                f.Delete();
            }
        }
        root.Delete(true);
    }

編集:申し訳ありませんが、これを忘れました:

インストール時に問題が発生しているフォルダーで、「ユーザー」アカウントにフルコントロールを与えています:

        System.Security.Principal.SecurityIdentifier sid = new System.Security.Principal.SecurityIdentifier(
            System.Security.Principal.WellKnownSidType.BuiltinUsersSid, null);
        System.Security.Principal.NTAccount acct = sid.Translate(typeof(System.Security.Principal.NTAccount))
            as System.Security.Principal.NTAccount;
        string usr = acct.ToString();

        DirectoryInfo info = new DirectoryInfo(dir);
        DirectorySecurity ds = info.GetAccessControl();

        ds.AddAccessRule(new FileSystemAccessRule(usr, FileSystemRights.FullControl, AccessControlType.Allow));
        ds.AddAccessRule(new FileSystemAccessRule(usr, FileSystemRights.FullControl,
            InheritanceFlags.ObjectInherit | InheritanceFlags.ContainerInherit, PropagationFlags.InheritOnly,
            AccessControlType.Allow));
        info.SetAccessControl(ds);
4

1 に答える 1

1

この問題を引き起こす一般的なオプションが 2 つあります
。1) アプリケーションが管理者以外のユーザーとして実行されている。
2) アプリケーションは、それによって作成されたファイルを何らかの形でまだロックしています。

ファイルがそれによって作成されたため、最初のオプションはありそうもないので、2 番目のオプションに焦点を当てましょう。この問題を簡単に特定するには、アプリケーションの実行中に (プロセスが速い場合は、デバッガーを使用して一時停止できます)、これらのファイルを手動で削除してみてください。失敗した場合は、アプリケーションがまだロックされていることを意味します。

その場合は、すべてのファイル ストリームを閉じて、正しく破棄してください。

于 2011-11-15T13:38:41.030 に答える