- 質問:ユーザーの [マイ ドキュメント] フォルダをスキャンしているときにこのエラーが発生するのに、[マイ ミュージック/マイ ピクチャ/マイ ビデオ] ディレクトリをスキャンするとエラーが発生しないのはなぜですか?
- 二次的な、 あまり重要でない質問: これらのフォルダーを特にフィルターで除外したり、try/catch ブロックを使用したりせずに、これを回避する方法はありますか?
私は魚を与えるよりも、釣り方を教えてくれる答えを好みます。現時点では、この質問に具体的に答えるためにどこを見る必要があるのか わかりません. 権限の昇格とファイル システムの反復処理 に関するドキュメントを読み、「User\My Music」では DirectoryInfo を設定できるが、「User\Documents\My Music」(リンク) では設定できない理由を探すのに 1 週間を費やしました。もっと学ぶことに関して、別の方向に少しブーストを楽しむでしょう.
Directory.GetFiles('path', "*", SearchOption.AllDirectories) を試行したときに最初にスローされる最初の 'UnauthorizedAccessException' をキャッチします。パスはユーザーの 'My Documents' です。例外を処理するには、ディレクトリを手動で移動する必要があることを知っています。これは機能し、サブディレクトリからファイルを返します。
最初の GetFiles 関数のコード:
public static string[] GetFiles(string path)
{
string[] files;
try
{
files = Directory.GetFiles(path, "*", SearchOption.AllDirectories);
}
catch(UnauthorizedAccessException ex)
{ files = WalkDirectory(path); }
return files;
}
public static string[] WalkDirectory(string path)
{
List<string> files = new List<string>();
DirectoryInfo dir = new DirectoryInfo(path);
foreach (DirectoryInfo subDir in dir.GetDirectories())
{
try
{
files.AddRange(WalkDirectory(subDir.FullName));
}
catch(UnauthorizedAccessException ex)
{
// complete fail to walk directory listed
throw ex;
}
}
foreach (FileInfo file in dir.GetFiles())
{
files.Add(file.FullName);
}
}
これは、コードが非表示のフォルダー (マイ ミュージック、マイ ピクチャ、またはマイ ビデオ) を調べようとするまでは、完全に機能します。非表示のファイルをどのように再コーディングしようとしても、UnauthorizedAccessException を受け取り続けます。
私はこれを回避するためにコーディングすることを完全に理解しています。主に私が知りたいのは、ユーザーフォルダーの下で例外が発生するのはなぜですか?
私が行っている仮定は、パス?:\users directory\user\My (Music、Pictures、または Videos)を作成できるため、フォルダーは別のディレクトリへのシンボリックリンクであり、コードはそれらのディレクトリを問題なくウォークします。これは、ユーザーのマイ ドキュメント内からディレクトリ ファイルを設定した後、ディレクトリ ファイルをスキャンしようとした場合にのみ発生します。
- OS: Windows7
- ユーザー権限:管理者
- 管理者として実行するために昇格されたアプリケーション