2009-07-12 23 views
1

私はスタートメニューの項目を繰り返し処理しようとしていますが、UnauthorizedAccessExceptionを受け取り続けます。私はディレクトリの所有者で、私のユーザーは管理者です。ここで自分自身のディレクトリ内のUnauthorizedAccessException

は、私の方法は、(それがDLLプロジェクトにあります)です:それはサブディレクトリを反復するために開始したときに

// root = C:\Users\Fernando\AppData\Roaming\Microsoft\Windows\Start Menu 
private void walkDirectoryTree(DirectoryInfo root) { 
    try { 
     FileInfo[] files = root.GetFiles("*.*"); 
     foreach (FileInfo file in files) { 
      records.Add(new Record {Path = file.FullName}); 
     } 
     DirectoryInfo[] subDirectories = root.GetDirectories(); 
     foreach (DirectoryInfo subDirectory in subDirectories) { 
      walkDirectoryTree(subDirectory); 
     } 
    } catch (UnauthorizedAccessException e) { 
     // do some logging stuff 
     throw; //for debugging 
    } 
} 

コードは失敗します。他に何をすべきですか?すでにマニフェストファイルを作成しようとしましたが、動作しませんでした。 別のポイント(該当する場合):Visual Studio(管理者として実行)で単体テストを実行しています。

答えて

4

説明に基づいて、UACが有効な状態で実行しているときにユーザーがアクセスできないディレクトリがあるようです。コードに本質的に間違ったものは何もなく、その状況での動作は設計によるものです。アカウントで現在実行中のコンテキスト内のディレクトリにアクセスできないという事実を回避するために、コード内で行うことは何もありません。

あなたがする必要があるのは、アクセスできないディレクトリのアカウントです。おそらく最善の方法は、いくつかの拡張メソッドを追加することです。たとえば、

public static FileInfo[] GetFilesSafe(this DirectoryRoot root, string path) { 
    try { 
    return root.GetFiles(path); 
    } catch (UnauthorizedAccessException) { 
    return new FileInfo[0]; 
    } 
} 
+0

例外を回避するには、拡張メソッドを使用するのが良い方法でした。私のスタートメニューに "見つからない"エントリを取得するには、レジストリキー 'HKLM¥Software¥Microsoft¥Windows¥CurrentVersion¥Explorer¥Shell¥Folders¥Common Start Menu'をポイントしたパスに従っています。 – Fernando

関連する問題