2012-05-07 25 views
4
  1. 問題:爲什麼我得到這個錯誤,而掃描用戶的「我的文檔」文件夾,而不是當我掃描了「我的音樂/我的圖片/我的視頻'目錄?
  2. 次,不太重要的問題:是否有辦法避免這種情況,而不必對這些文件夾專門過濾掉,或使用try/catch塊?

我更喜歡那些教我如何釣魚的答案,而不僅僅是給我魚。就在這一點上,我不確定我需要專門回答這個問題。我已閱讀有關elevating permissionsiterating through the file system的文檔,並花了好一週的時間尋找爲什麼我可以在User \ My Music上設置DirectoryInfo,而不是'User \ Documents \ My Music'(鏈接),只是會享受一點點在瞭解更多信息方面提高了不同的方向。UnauthorizedAccessException同時掃描目錄「用戶 Documents 我的音樂」

我在嘗試使用Directory.GetFiles('path',「*」,SearchOption.AllDirectories)路徑是用戶的「我的文檔」時最初引發的初始「UnauthorizedAccessException」。爲了處理這個異常,我知道我需要手動操作目錄。哪些工作,從子目錄返回文件。

初始的GetFiles功能代碼:

public static string[] GetFiles(string path) 
{ 
    string[] files; 
    try 
    { 
     files = Directory.GetFiles(path, "*", SearchOption.AllDirectories); 
    } 
    catch(UnauthorizedAccessException ex) 
    { files = WalkDirectory(path); } 
    return files; 
} 

public static string[] WalkDirectory(string path) 
{ 
    List<string> files = new List<string>(); 
    DirectoryInfo dir = new DirectoryInfo(path); 

    foreach (DirectoryInfo subDir in dir.GetDirectories()) 
    { 
     try 
     { 
      files.AddRange(WalkDirectory(subDir.FullName)); 
     } 
     catch(UnauthorizedAccessException ex) 
     { 
      // complete fail to walk directory listed 
      throw ex; 
     } 
    } 
    foreach (FileInfo file in dir.GetFiles()) 
    { 
     files.Add(file.FullName); 
    } 
} 

這工作很完美,直到代碼嘗試走隱藏的文件夾:我的音樂,我的圖片或我的視頻。無論我如何嘗試並重新編碼來隱藏文件,我都會收到UnauthorizedAccessException。

我完全理解我將對此進行編碼。主要是我很好奇的是,爲什麼在用戶文件夾下發生異常?

我想提出一個asssumption是該文件夾是一個符號鏈接到其他目錄,因爲我可以做的路徑:\ Users目錄\用戶\我的(音樂,圖片或視頻)和代碼走那些目錄,然後沒有任何問題。這僅發生在嘗試從用戶「我的文檔」中設置目錄文件後進行掃描時發生。

  • OS: Windows 7的
  • 用戶Privliages:管理員
  • 應用提升到以管理員身份運行

回答

2

我說到這個的朋友,誰是不技術,但知道足夠的技術來進行對話,他幫助我進一步縮小了這個問題的範圍。這實際上是一個重複的問題,並在Check if a file is real or a symbolic link回答。

該文件夾是根據這篇文章TechRepublic的這是擺在那裏的向後兼容性目的的符號鏈接:下段Answers to some common questions about symbolic linksWindows Vista和Windows 7具有內置的符號鏈接第2款

爲了避免嘗試在UnauthorizedAccessException沒有Try/Catch塊的情況下掃描此目錄,需要檢查文件夾屬性以確定所討論的文件夾或文件是否是符號鏈接。在上面列出的stackoverflow問題中再次回答了這個問題。