6
  1. 質問:ユーザーの [マイ ドキュメント] フォルダをスキャンしているときにこのエラーが発生するのに、[マイ ミュージック/マイ ピクチャ/マイ ビデオ] ディレクトリをスキャンするとエラーが発生しないのはなぜですか?
  2. 二次的な、 あまり重要でない質問: これらのフォルダーを特にフィルターで除外したり、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
  • ユーザー権限:管理者
  • 管理者として実行するために昇格されたアプリケーション
4

1 に答える 1

3

私は技術的ではないが、会話をするのに十分な技術を知っている友人とこれについて話していました、そして彼は私がこの質問をさらに絞り込むのを手伝ってくれました。これは実際には重複した質問であり、ファイルが本物かシンボリックリンクかを確認するで回答されました。

このフォルダーは、 TechRepublicのこの記事に従って、下位互換性の目的でそこに配置されたシンボリックリンクです。WindowsVistaおよびWindows 7のセクションにあるシンボリックリンクに関するいくつかの一般的な質問への回答には、シンボリックリンクの段落2が組み込まれています。

UnauthorizedAccessExceptionでTry/Catchブロックなしでこのディレクトリをスキャンしようとするのを特に回避するには、フォルダ属性をチェックして、問題のフォルダまたはファイルがシンボリックリンクであるかどうかを判断する必要があります。これも、上記のスタックオーバーフローの質問で回答されました。

于 2012-05-16T06:50:43.853 に答える