2011-09-17 12 views
0

現在、私は、ユーザが音楽ファイルのディレクトリとサブディレクトリを検索し、それらをコレクションに追加するプログラムを持っています。しかし、それが来るディレクトリの1つが保護されている場合は、プログラムが失敗します。この問題を回避するために検索しようとする前に、ユーザーがディレクトリにアクセスできるかどうかを確認する方法を知りたかったのです。 以下は私が検索に使用しているコードですが、現在は "System Volume Information"の基本的な回避策がありますが、他の保護されたディレクトリが存在する可能性があるため、これを変更する必要があります。特定のディレクトリのアクセス権を確認するにはどうすればよいですか?

public void SearchForMusic() 
    { 
     //Searches selected directory and its sub directories for music files and adds their path to ObservableCollection<string> MusicFound 
     foreach (string ext in extentions) 
     { 
      foreach (string song in Directory.GetFiles(SearchDirectory, ext)) 
      { 
       musicFound.Add(song);     
      } 

      foreach (string directory in Directory.GetDirectories(SearchDirectory)) 
      { 
       if (directory.Contains("System Volume Information")) 
       { 

       } 
       else 
       { 
        foreach (string song in Directory.GetFiles(directory, ext)) 
        { 
        musicFound.Add(song); 
        } 

        foreach (string subDirectory in Directory.GetDirectories(directory)) 
        { 
         foreach (string subSong in Directory.GetFiles(subDirectory, ext)) 
         { 
          musicFound.Add(subSong); 
         } 
        } 
       } 
      } 
     } 
    } 

多くの感謝:)

答えて

2

断然ファイルシステムオブジェクトへのアクセスを持っていることを確認するための最も簡単な方法は、それをアクセスしようとすることです。アクセス拒否エラーで失敗した場合は、アクセス権がありません。そのエラー状態を検出し、検索の次の項目に進みます。

つまり、デリゲートはアクセス権の最終的なアービターであるシステムへのアクセスをチェックします。

+0

+1; @ジョナサン:例外処理( 'try' /' catch')は、使用しているAPIがあなたに他のオプションを与えない限り、例外的な場合に予約する必要があります。可能であれば、状態チェックまたは「試行」バリアントを使用してください。しかし、ここでは便利なものは見えません( 'GetAccessControl'?)。だから、例外ハンドラがついているかもしれません。しかし、 'UnauthorizedAccessException'(または特定の例外がスローされているもの)を捕捉して、ベースの' Exception'クラスではないことを確認してください。 –

+1

@Merlyn 'try/catch'についてのあなたのポイントは有効ですが、それはbehvaiourの正しさを上書きしてはいけません。 'try/catch'を避け、独自の権利チェックコードを実装すると、通常の動作に対して例外を使用しないことに喜んでいるかもしれませんが、プログラムがうまく動作しないときには慰めにはなりません。また、私の答えでは、例外ではなくエラーを検出することに言及しました。優れたファイル処理APIは、TryXXXの亜種を提供する必要があります。 –

+0

私は完全に同意します。私の主張は、あなたが既存のチェックメソッドを持っているとき、そしてあなたが興味を持っているケースをキャッチすることができるときに成り立ちます。その確信を与えるコードを得ることができないならば、例外ハンドラとコメントなぜあなたは例外を飲み込んでいるのかは間違いありません。 –

1

thisの質問には、Write with Read権限を置き換えることができます。また、try catchブロックにコードをラップし、例外がスローされた場合は、そのディレクトリをトラバースできないと想定したり、例外タイプを確認したりすることができます。

+0

+1;良いリファレンス。しかし、彼らが推奨するメソッドは 'Obsolete'(' SecurityManager.IsGranted')とマークされているようですので、難しいです。また、例外処理についてのDavidの答えのコメントを参照してください.-あなたは間違っていません:) –

+0

True - 私は強力なPythonの背景を持っていて、おそらく "許可の代わりに許しを考えてください"ということを知っています。フローの - もちろん、TrySomethingメソッドがある場合、それらは常に.NETで優れており、例外をキャッチするテストは推奨された方法ではありません/ベストプラクティスです。 – leon

関連する問題