4

現在ログインしているユーザーのお気に入りを取得しようとする C# コードがあります。このコードは、Windows Explorer プロセスに読み込まれる Taskbar Toolbar の一部です。ローミング プロファイルまたはフォルダー リダイレクトが設定され、有効になっているドメインで UAC を有効にして Windows Vista を使用しているユーザーがいます。お気に入りパスで Directory.GetDirectories を呼び出すと、「System.IO.DirectoryNotFoundException: パス 'C:\Users\\Favorites\ の一部が見つかりませんでした」がスローされます。ローミング プロファイルまたはフォルダ リダイレクトが設定されていない他のドメインの他のユーザーには、この問題はありません。

ユーザーは、失敗したログから実行プロンプトにパスをコピーしてもパスの読み込みに失敗すると報告しましたが、エクスプローラーを使用して直接パスに移動し、そのパスをコピーして実行プロンプトに貼り付けると、機能します。彼は私に両方のパスを送ってくれましたが、まったく同じでまったく意味がありません。

私の理論では、これは、そのパスが実際にはサーバー上の共有を指しているが、(Directory.GetDirectories から返された directoryInfo の) サブディレクトリにアクセスしようとするとリダイレクトが失敗するフォルダー リダイレクトが原因であると考えられます。初期ディレクトリは機能しますが、初期ディレクトリのすべてのサブディレクトリが正しくリダイレ​​クトされません。

このような状況に遭遇した人や、リダイレクトされたフォルダーに適切にアクセスするための回避策を知っている人はいますか?

private void GetFavorites()
    {
        try
        {
            System.IO.DirectoryInfo dirInfo = new System.IO.DirectoryInfo(Environment.GetFolderPath(Environment.SpecialFolder.Favorites));
            AddFavorites(dirInfo);
        }
        catch
        {
        }
    }

private void AddFavorites(DirectoryInfo dirInfo)
    {
        foreach (System.IO.FileInfo fileInfo in dirInfo.GetFiles("*.url"))
        {
            //string alias = fileInfo.Name.Replace(".url", "");

            if (!ItemsBookmarks.ContainsKey(fileInfo.Name))
                ItemsBookmarks.Add(fileInfo.Name, fileInfo.Name);

        }

        foreach (System.IO.FileInfo fileInfo in dirInfo.GetFiles("*.lnk"))
        {

            if (!ItemsBookmarks.ContainsKey(fileInfo.Name))
                ItemsBookmarks.Add(fileInfo.Name, fileInfo.Name);

        }

        foreach (System.IO.DirectoryInfo objDir in dirInfo.GetDirectories())
        {
            AddFavorites(objDir);
        }
    }

ありがとう、

ジョン

4

1 に答える 1

1

あなたが経験している問題は、リパースポイントに関連していると思います。

参照: http: //msdn.microsoft.com/en-us/library/bb513869.aspx

参照:.net(c#)で再解析ポイントを確認するための最良の方法は何ですか?

この問題は、次の構文を使用することで回避できます。

private void AddFavorites(string dirPath)
{
    try
        {
            foreach (string fileName in Directory.GetFiles(dirPath, "*.*", SearchOption.TopDirectoryOnly))
            {
                //string alias = fileInfo.Name.Replace(".url", "");

                if (!ItemsBookmarks.ContainsKey(fileInfo.Name))
                {
                    ItemsBookmarks.Add(fileName);
                }
            }

            foreach (string subDirName in Directory.GetDirectories(dirPath, "*.*", SearchOption.TopDirectoryOnly))
            {
                AddFavorites(objDir);
            }
        }
        catch
        {
            //error getting files or subdirs... permissions issue?
            //throw
        }
}
于 2012-11-24T00:48:04.563 に答える