0

ディレクトリとサブディレクトリを含むツリービューをロードしています。私の電話:

string[] dirs = Directory.GetDirectories(Environment.GetFolderPath(Environment.SpecialFolder.MyDocuments));

必要なすべてのディレクトリとそうでないディレクトリを返します...アクセスできない/仮想の「マイミュージック」、「マイビデオ」など...もちろん、ライブラリ構造のため、これらのディレクトリでは再帰を実行できません(アクセス拒否された)...

これらのアクセスできないディレクトリへの入力を回避するにはどうすればよいですか? OS が Vista または 7 の場合は、配列を反復処理して不要なディレクトリを削除し、XP のままにしておくことができます...しかし、これに対するより「エレガントな」ソリューションがあるかどうか知りたいですか?

Wimの助けを借りて、私はこれを思いつきました:

    private List<string> MyDocuments()
    {
        List<string> dirs = new List<string>(Directory.GetDirectories(
            Environment.GetFolderPath(Environment.SpecialFolder.MyDocuments)));

        for (int i = 0; i < dirs.Count-1; i++)
        {
            DirectoryInfo di = new DirectoryInfo(dirs[i]);
            if (di.Attributes.HasFlag(FileAttributes.ReparsePoint))
                dirs.RemoveAt(i);
        }

        return dirs;
    }
4

1 に答える 1

1

これらのディレクトリは非表示であり、ReparsePoint属性を持っているようです (空にする必要があります。詳細については、msdn およびWhat is the best way to check for reparse point in .net (c#)?を参照して、その方法を確認してください)。

エレガントなコードを検索する必要があることは理解できますが、問題は、各ディレクトリを反復処理してこの属性を確認し、その後、ディレクトリの配列またはリストへの追加をスキップすることができますが、dirs 配列を反復するよりもエレガントではありません。例外をキャッチしてエントリを削除します。つまり、要するに、私は固執します:

List<string> dirs = Directory.GetDirectories(Environment.GetFolderPath(Environment.SpecialFolder.MyDocuments)).ToList();
string[] mySubDirs;

for (int i = 0; i < dirs.Count-1; i++)
{
    try
    {
        mySubDirs = Directory.GetDirectories(dirs[i]);
    }
    catch (Exception)
    {
        dirs.RemoveAt(i);
    }
}
于 2013-01-08T20:46:26.810 に答える