5

一連のディレクトリを再帰的にループします。それらのいくつか ( D:\$RECYCLE.BIN\S-1-5-20など) は、System.UnauthorizedAccessException. 私はそれをキャッチして先に進むことができると思いますが、事前にそれを把握したいと思います.

だから、私がDirectoryInfoオブジェクトを持っているとき。許可されているかどうか、また許可されているGetDirectories()可能性があるかどうかを確認するにはどうすればよいDelete()ですか?

4

3 に答える 3

12

削除する場合は、削除を試みてから続行します (必要に応じて例外を処理します)。

チェックしてから削除する必要がある場合に削除を実行すると、ファイルシステムで競合状態が発生する可能性がありますが、わずかではあります。これは、ほとんどすべてのファイル/ディレクトリ アクセス操作に適用されます。ほとんどのファイルシステム操作はアトミックであるように設計されており、このロジックをユーザー コードに移動すると、このアトミック性が競合し、発生する可能性のある例外を処理する必要があります

于 2009-10-21T23:21:48.090 に答える
4

次のコードを作成しました。それが役立つかどうかを確認してください:

//using System.IO;
//using System.Security.AccessControl;
//using System.Security.Principal;

string[] directories = Directory.GetDirectories(
    Path.Combine(Environment.CurrentDirectory, @"..\.."), 
    "*", SearchOption.AllDirectories);
foreach (string directory in directories)
{
    DirectoryInfo info = new DirectoryInfo(directory);
    DirectorySecurity security = info.GetAccessControl();
    Console.WriteLine(info.FullName);
    foreach (FileSystemAccessRule rule in 
             security.GetAccessRules(true, true, typeof(NTAccount)))
    {
        Console.WriteLine("\tIdentityReference = {0}", rule.IdentityReference);
        Console.WriteLine("\tInheritanceFlags  = {0}", rule.InheritanceFlags );
        Console.WriteLine("\tPropagationFlags  = {0}", rule.PropagationFlags );
        Console.WriteLine("\tAccessControlType = {0}", rule.AccessControlType);
        Console.WriteLine("\tFileSystemRights  = {0}", rule.FileSystemRights );
        Console.WriteLine();
    }
}

結果:

D:\Projects\ConsoleApplication1\bin
    IdentityReference = BUILTIN\管理者
    InheritanceFlags = ContainerInherit、ObjectInherit
    PropagationFlags = なし
    AccessControlType = 許可
    FileSystemRights = フルコントロール

IdentityReferenceおよびFileSystemRightsプロパティに注意してください。おそらく、ディレクトリを削除する前に、現在の ACL をそれらに対してテストする必要があります。

于 2009-10-21T23:48:11.330 に答える
0

GetDirectories()独自のメソッドを作成する必要があると思います。その中のものを再帰的に取得します。

この Microsoft Articleには、その方法に関する優れた記事があります。少し作業すれば、汎用リストを使用してソリューションに適合させることができます。

簡単に言えば、 System.IO.Directory.GetDirectories() は、これらの例外のいずれかを取得するたびに失敗します。

大まかにこのようなコード (上記からコピー) を使用して開始する必要があります

    List<String> directories = new List<String>();
    void DirSearch(string sDir) 
    {
        try 
        {
            foreach (string d in Directory.GetDirectories(sDir)) 
            {
                //foreach (string f in Directory.GetFiles(d, txtFile.Text)) 
                //{
                //    
                //}
                // use this to search for files recursivly.
                directories.Add(d);
                DirSearch(d);
            }
        }
        catch (System.Exception excpt) 
        {
            Console.WriteLine(excpt.Message);
        }
    }

ディレクトリのリストを取得したら、それらに対して操作を実行できます。いくつかの mod を使用すると、上記の方法でリスト内のすべての読み取り権限を確実に取得できます。

于 2009-10-21T23:18:26.457 に答える