2012-11-27 59 views
1
DirectoryInfo[] directories = 
     di.GetDirectories("*.*", SearchOption.AllDirectories); 

問題是某些文件夾我無法訪問,因此我得到一個異常。使用GetDirectories檢索目錄時檢查文件夾/文件權限

程序文件,例如我無法訪問。

有沒有解決方法?

編輯: 下面是代碼。正如你所看到的,我已經配置了代碼,以便在發生異常時繼續執行。當它發生時,我只能得到消息訪問路徑'C:\ Arquivos de Programas'被拒絕。並且沒有文件或文件夾

如何避免此行爲並在屏幕上打印我擁有的權限?

感謝

try 
{ 
    //Resgata todos os drivers Lógicos do Sistema 
    DriveInfo[] allDrives = DriveInfo.GetDrives(); 

    //Cria uma lista não ordenada para os DRIVERS 
    Response.Write("<ul class=\"jqueryFileTree\" style=\"display: none;\">\n"); 

    //Itera sobre cada driver no array 
    foreach (DriveInfo drive in allDrives) 
    { 
     if (drive.IsReady == true) 
     { 
      try //GetDirectories 
      { 
       //Para cada driver cria um LI A 
       Response.Write("\t<li class=\"drive collapsed\"><a href=\"#\" rel=\"" + drive.ToString() + "\">" + drive.ToString() + "</a>\n"); 

       System.IO.DirectoryInfo di = new System.IO.DirectoryInfo(drive.ToString()); 
       DirectoryInfo[] directories = di.GetDirectories("*.*", SearchOption.AllDirectories); 


       Response.Write("<ul>"); 
       //Itera sobre os subdiretórios de cada driver 
       foreach (System.IO.DirectoryInfo di_child in directories) 
       { 

        Response.Write("\t<li class=\"directory collapsed\"><a href=\"#\" rel=\"" + drive + di_child.Name + "/\">" + di_child.Name + "</a>\n"); 
        Response.Write("<ul>"); 
        //Itera sobre todos os arquivos do diretório 


        foreach (System.IO.FileInfo fi in di.GetFiles()) 
        { 
         string ext = ""; 
         if (fi.Extension.Length > 1) 
         { 
          ext = fi.Extension.Substring(1).ToLower(); 
         } 

         Response.Write("\t<li class=\"file ext_" + ext + "\"><a href=\"#\" rel=\"" + drive + fi.Name + "\">" + fi.Name + "</a></li>\n"); 
        }// Arquivos 
        Response.Write("</ul></li>"); 
       }// subdiretorio 
       Response.Write("</ul></li>"); 
      } 
      catch (UnauthorizedAccessException e) 
      { 
       Response.Write(e.Message); 
       continue; 
      } 
      catch (System.IO.DirectoryNotFoundException e) 
      { 
       Response.Write(e.Message); 
       continue; 
      } 
      catch (Exception e) 
      { 

       Response.Write(e.Message); 
       continue; 
      } 

     }//isReady 

    }///drive 
    Response.Write("</ul>"); 

} 
catch (Exception) 
{ 

    throw; 
} 
+0

什麼是你想上的目錄做一旦你找到了他們? EaiXará,brasileirotambémné? – Chris

+0

EaiXará,brasileirotambémné? estava com o mesmo problema,fiz um try catch sendo q no catch eu mostrava na lista um item escrito「Acesso Negado」,funcionou aqui。 obrigado。 –

回答

2

一般來說,沒有任何workarround。

您不允許在主機PC上更改(在大多數情況下您根本無法)許可權地圖。所以唯一能想到的就是你可以做的只是發現一個異常並向用戶報告這個事實,可能會有一些暗示,這個問題怎麼能解決。

可能是一些黑客,技巧或任何,但在我看來,這不是好的設計。 不要破解系統,除非你不寫病毒。

編輯

如果你擔心一個事實,如果單個文件的加載失敗,你的目錄解析失敗,你可以做到以下幾點:

foreach (System.IO.FileInfo fi in di.GetFiles()) 
{ 
    try{ 
      string ext = ""; 
      if (fi.Extension.Length > 1) 
      { 
       ext = fi.Extension.Substring(1).ToLower(); 
      } 

      Response.Write("\t<li class=\"file ext_" + ext + "\"><a href=\"#\" rel=\"" + drive + fi.Name + "\">" + fi.Name + "</a></li>\n"); 
     } 
     catch(..) { 
      //handle here exception raised during SINGLE file parsing 
     } 
}// Arquiv 
+0

如果用戶沒有權限訪問文件,我只想跳過檢查...如果沒有權限,打印文件夾或文件... –

+0

啊,在這一點上,我相信,在循環內部處理適當的異常,是一個不錯的選擇。像普通的IO操作管理一樣,使用適當或預期的異常處理 – Tigran

+0

來管理問題。如果getDirectory或getFile未經許可而達到文件,則整個方法失敗。; O(即使處理代碼,對於該特定邏輯驅動程序,您將丟失所有內容,並將代碼轉到下一個邏輯驅動程序 –

0

是有,不幸的是,這是GetDirectories的限制。

退房:Windows service running as system cannot access C:\users\

在上面的例子中,無論發生權限級別的execptions,但同樣的原則也適用。當你遇到異常時,整個功能失敗。

按照該文章鏈接文章中的建議使用PInvoke,您至少可以繼續,忽略異常而不是徹底失敗。

+0

它確實有效,但該方法仍然失敗,所以對於那個邏輯驅動程序,我什麼也得不到。系統不會崩潰,我可以在下一個邏輯驅動程序中進行搜索,但不能搜索發生異常的程序 –