DirectoryNotFoundException при вызове Directory.GetDirectories для Environment.SpecialFolder.Foving из-за перенаправления папки домена - PullRequest
4 голосов
/ 30 июня 2009

У меня есть некоторый код C #, который пытается получить Избранное для текущего пользователя, вошедшего в систему. Код является частью панели инструментов панели задач, которая загружается в процесс проводника Windows. У меня есть пользователь, который использует Windows Vista с включенным контролем учетных записей пользователей в домене, для которого включены или настроены параметры «Роуминг профилей» или «Перенаправление папок». При вызове Directory.GetDirectories по пути «Избранное» выдается «System.IO.DirectoryNotFoundException: не удалось найти часть пути« C: \ Users \\ Favorites \ ». Другие пользователи в других доменах, которые не имеют перемещаемых профилей или настройки перенаправления папок, не имеют этой проблемы.

Пользователь также сообщил, что копирование пути из сбойных журналов в приглашение на запуск не приводит к загрузке пути, но если они переходят по пути непосредственно с помощью проводника, а затем копируют и вставляют этот путь в приглашение на запуск, это работает. Он послал мне оба пути, и они абсолютно идентичны, что не имеет никакого смысла.

Моя теория заключается в том, что это вызвано перенаправлением папок, когда этот путь фактически указывает на общий ресурс на сервере, но перенаправление не выполняется при попытке доступа к подкаталогам (из directoryInfo, возвращенного из Directory.GetDirectories). Начальный каталог работает, но все подкаталоги исходного каталога не перенаправляют правильно.

Кто-нибудь сталкивался с подобной ситуацией и / или знает обходной путь для получения надлежащего доступа к перенаправленным папкам?

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);
        }
    }

Спасибо

John

1 Ответ

1 голос
/ 24 ноября 2012

Я полагаю, что проблема, с которой вы столкнулись, связана с очками повторной обработки.

См .: 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
        }
}
...