DOBON.NET DOBON.NETプログラミング掲示板過去ログ

【C#】GetFilesによるアクセス拒否

環境/言語:[環境:Visual C# 2010 Express 使用言語:C#]
分類:[.NET]

Directory.GetFiles(String, String, SearchOption)
このメソッドを使ってファイルを全て取得しようとしているのですが
アクセスが拒否されましたUnauthorizedAccessException
と出て実行出来ません。

そこでGetDirectoriesとGetFilesを使ってtrycatchで例外が出たらスキップという風にやっているのが今のところ一番早いのですが他にやり方はないのでしょうか??

上のものに例外が出たフォルダパスをテキストに保存して次に検索する時にそのパスが来たらtrycatchの前にスキップというのもやったのですが、毎回そのパスが過去に例外を出したかチェックを全てのパスに対して行っているせいかたいして早くなりませんでした。

if(パス==アクセス権限がない)のようにしようとしましたがよく分からず出来ませんでした。

よろしくお願いします。
■No27843に返信(Maidさんの記事)
> Directory.GetFiles(String, String, SearchOption)
> このメソッドを使ってファイルを全て取得しようとしているのですが
> アクセスが拒否されましたUnauthorizedAccessException
> と出て実行出来ません。
そのように書かれていますね。
http://msdn.microsoft.com/ja-jp/library/dd997370.aspx

》 AllDirectories オプションを使用すると親ディレクトリの
》 サブディレクトリ内のすべてのファイルをすぐに列挙できますが、
》 承認されていないアクセスの例外 (UnauthorizedAccessException) が
》 原因で列挙が不完全になる可能性があります。
》 このような例外が発生する可能性がある場合は、まず
》 ディレクトリを列挙してからファイルを列挙することで、
》 例外をキャッチして続行できます。

> そこでGetDirectoriesとGetFilesを使ってtrycatchで例外が出たらスキップという風にやっているのが今のところ一番早いのですが
上記の手法でしょうか? コードを見たわけでは無いですが、考え方としては
それで特に問題ないと思います。

> 他にやり方はないのでしょうか??
FindFirstFile/FindNextFile API で列挙とか。
早い返信ありがとうございます。

> そのように書かれていますね。
> http://msdn.microsoft.com/ja-jp/library/dd997370.aspx
>
> 》 AllDirectories オプションを使用すると親ディレクトリの
> 》 サブディレクトリ内のすべてのファイルをすぐに列挙できますが、
> 》 承認されていないアクセスの例外 (UnauthorizedAccessException) が
> 》 原因で列挙が不完全になる可能性があります。
> 》 このような例外が発生する可能性がある場合は、まず
> 》 ディレクトリを列挙してからファイルを列挙することで、
> 》 例外をキャッチして続行できます。

> 上記の手法でしょうか? コードを見たわけでは無いですが、考え方としては
> それで特に問題ないと思います。

MSDNと同じやり方でした。一応現在の速度に不満はありますが待てないレベルではないのでこのやり方でやることにします。

> FindFirstFile/FindNextFile API で列挙とか。

分からなかったので調べてみましたが、C#のメソッドでも同じようなことが出来ますよね・・・?速度などが違うのでしょうか??
■No27845に返信(Maidさんの記事)
>>FindFirstFile/FindNextFile API で列挙とか。
> 分からなかったので調べてみましたが、C#のメソッドでも同じようなことが出来ますよね・・・?速度などが違うのでしょうか??
できますよ。それでもあえて他の方法を探しているようでしたので、
標準的でない方法として、アンマネージAPIを紹介したというだけです。(^^;

それ以外の手法としては、DIR /S /B コマンドで得られる標準出力を
利用するという手もあるかと思います。

いずれの方法を使うにしても、速度面に関してはやってみないと分かりませんが、
マネージAPIよりも大幅に遅くなってしまうような事は無い気がします。
とはいえ、ファイル数が多い場合や、ディレクトリ階層が深い場合は、
どのような手法を使ったとしても、それなりに時間がかかってしまうでしょうね。

DOBON.NET | プログラミング道 | プログラミング掲示板