13

重複の可能性:
.NET-例外処理なしでディレクトリにアクセスできるかどうかを確認します

Visual Studio2010でNET3.5とC#を使用して小さなファイルエクスプローラーを作成しています。この関数を使用して、ディレクトリにアクセスできるかどうかを確認します。

RealPath=@"c:\System Volume Information";
public bool IsAccessible()
{
    //get directory info
    DirectoryInfo realpath = new DirectoryInfo(RealPath);
    try
    {
        //if GetDirectories works then is accessible
        realpath.GetDirectories();                
        return true;
    }
    catch (Exception)
    {
        //if exception is not accesible
        return false;
    }
}

しかし、大きなディレクトリでは、すべてのサブディレクトリを取得してディレクトリにアクセスできるかどうかを確認するのに時間がかかる可能性があると思います。この機能を使用して、保護されたフォルダまたはCD / DVDドライブをディスクなしで探索しようとしたときのエラー(「デバイスの準備ができていません」エラー)を防止します。

アプリケーション(できればNET 3.5)がディレクトリにアクセスできるかどうかを確認するためのより良い方法(より高速)はありますか?

4

2 に答える 2

14

MSDNによるとDirectory.Exists、ディレクトリへの読み取りアクセス権がない場合はfalseを返す必要があります。ただし、これには使用できますDirectory.GetAccessControl。例:

public static bool CanRead(string path)
{
    try
    {
        var readAllow = false;
        var readDeny = false;
        var accessControlList = Directory.GetAccessControl(path);
        if(accessControlList == null)
            return false;

        //get the access rules that pertain to a valid SID/NTAccount.
        var accessRules = accessControlList.GetAccessRules(true, true, typeof(System.Security.Principal.SecurityIdentifier));
        if(accessRules ==null)
           return false;

        //we want to go over these rules to ensure a valid SID has access
        foreach (FileSystemAccessRule rule in accessRules)
        {
            if ((FileSystemRights.Read & rule.FileSystemRights) != FileSystemRights.Read) continue;

            if (rule.AccessControlType == AccessControlType.Allow)
                readAllow = true;
            else if (rule.AccessControlType == AccessControlType.Deny)
                readDeny = true;
        }

        return readAllow && !readDeny;
    }
    catch(UnauthorizedAccessException ex)
    {
        return false;
    }
}

アップデート

一部のコメントで述べられているように、外部DOMAINの有効なSIDがアクセスできる場合、これは誤った値を返す可能性があります。現在のユーザーがアクセス権を持っているかどうかを確認するには、次のようなものが必要です。

foreach...

if (WindowsIdentity.GetCurrent().User.Value.equals(rule.IdentityReference.Value))

これにより、現在のユーザーのSIDがアクセスルールID参照と一致するかどうかが確認されますが、SecurityExceptionもスローされる可能性があります。

于 2012-07-29T14:52:15.927 に答える
0

GetAccessControlメソッドを探していると思います。このSystem.IO.File.GetAccessControlメソッドは、ファイルのアクセス制御をカプセル化するFileSecurityオブジェクトを返します。

于 2012-07-29T14:16:28.383 に答える