2009-06-29 7 views
4

現在ログインしているユーザーのお気に入りを取得しようとするC#コードがあります。このコードは、Windows Explorerプロセスにロードされるタスクバーツールバーの一部です。私は、ローミングプロファイルまたはフォルダリダイレクトが設定され有効になっているドメインでUACを有効にしたWindows Vistaを使用しているユーザーがいます。お気に入りパスでDirectory.GetDirectoriesを呼び出すと、 "System.IO.DirectoryNotFoundException:パス 'C:\ Users \\ Favorites \"の一部を見つけることができませんでした。移動プロファイルまたはフォルダリダイレクトのセットアップを持たない他のドメインの他のユーザーには、この問題はありません。DomainフォルダのリダイレクトによるEnvironment.SpecialFolder.FavoritesでDirectory.GetDirectoriesを呼び出すと、DirectoryNotFoundExceptionが発生する

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

これは、そのパスが実際にサーバー上の共有を指しているが、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); 
     } 
    } 

おかげで、

ジョン

答えて

1

私はあなたが経験している問題は、ポイントを再解析に関連していると信じています。

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

参照:What is the best way to check for reparse point in .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 
     } 
}