DirectoryNotFoundException при вызове Directory.GetDirectories для Environment.SpecialFolder.Foving из-за перенаправления папок домена
У меня есть код 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);
}
}
Спасибо,
Джон
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
}
}