現在、私は、ユーザが音楽ファイルのディレクトリとサブディレクトリを検索し、それらをコレクションに追加するプログラムを持っています。しかし、それが来るディレクトリの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);
}
}
}
}
}
}
多くの感謝:)
+1; @ジョナサン:例外処理( 'try' /' catch')は、使用しているAPIがあなたに他のオプションを与えない限り、例外的な場合に予約する必要があります。可能であれば、状態チェックまたは「試行」バリアントを使用してください。しかし、ここでは便利なものは見えません( 'GetAccessControl'?)。だから、例外ハンドラがついているかもしれません。しかし、 'UnauthorizedAccessException'(または特定の例外がスローされているもの)を捕捉して、ベースの' Exception'クラスではないことを確認してください。 –
@Merlyn 'try/catch'についてのあなたのポイントは有効ですが、それはbehvaiourの正しさを上書きしてはいけません。 'try/catch'を避け、独自の権利チェックコードを実装すると、通常の動作に対して例外を使用しないことに喜んでいるかもしれませんが、プログラムがうまく動作しないときには慰めにはなりません。また、私の答えでは、例外ではなくエラーを検出することに言及しました。優れたファイル処理APIは、TryXXXの亜種を提供する必要があります。 –
私は完全に同意します。私の主張は、あなたが既存のチェックメソッドを持っているとき、そしてあなたが興味を持っているケースをキャッチすることができるときに成り立ちます。その確信を与えるコードを得ることができないならば、例外ハンドラとコメントなぜあなたは例外を飲み込んでいるのかは間違いありません。 –