2013-12-12 41 views
4

我對C#真的很陌生,所以我一直在研究一個小型的寵物項目。獲取目錄時System.UnauthorizedAccessException

我創建了一個小程序,將目錄的大小與給定的大小進行比較。如果該目錄等於或大於該目錄,則它將該路徑記錄到該目錄。

long size = Convert.ToInt32(Size) * 1024 * 1024; 
string[] directories = Directory.GetDirectories(path, "*", SearchOption.AllDirectories); //the error occurs on this line 
Array.Sort(directories); 

foreach (string name in directories) 
    try 
    { 
     DirectoryInfo directory = new DirectoryInfo(name); 
     long dir = directory.EnumerateFiles("*", SearchOption.AllDirectories).Sum(fi => fi.Length); 

    if (dir >= ScanSize) 
     Console.WriteLine(directory); 
    } 

    catch (UnauthorizedAccessException) { } 

我應該注意的是,輸入的字符串,而long size = Convert.ToInt32(Size)Main()

來自論據,我讀的地方,我不應該使用

Directory.GetDirectories(ScanPath, "*", SearchOption.AllDirectories);

自它會一次獲得所有的目錄。但是如果我刪除它,它只會得到給定路徑中的目錄,沒有任何子目錄。所以我被告知申請遞歸,但是我發現這些很難。我在file.Attributes上閱讀了關於隱藏文件的一些內容,但我不知道在哪裏應用它們。

我是系統的管理員,我打算在整個數據驅動器上運行此操作。 D:\

但是在這種情況下,當程序試圖訪問D:\的垃圾桶時發生錯誤。但即使它跳過了這個特定位置,錯誤仍然會在另一個不可訪問的位置返回。

我希望這裏的任何人都知道一個很好的例子或知道一個網站,解釋這一點。

+1

有幾件事情要記住:1)您將無法訪問某些操作系統目錄只允許操作系統本身來訪問,而不是任何其他用戶帳戶,所以這可能是爲什麼。 2)如果您正在查看網絡目錄,您的帳戶可能沒有權限訪問它們,這也是原因。 3)如果您在ASP.NET/MVC中使用此代碼,那麼它將在應用程序池帳戶下運行,並且可能是目錄沒有根據允許添加用戶帳戶。你也沒有在你的代碼中指定你開始的初始路徑 –

+0

看看這個:http://stackoverflow.com/a/929418/425871 – Steve

+0

@Ahmedilyas我已經添加了一些更多的信息的問題。我希望這更清楚一點。 – user3095385

回答

0

遞歸是你的朋友在這裏。在循環中根據需要添加錯誤處理。試試這個:

private static long maxSize = 5 * 1024 * 1024; 

    static void Main(string[] args) 
    { 

     GetDirectorySize(new DirectoryInfo(@"d:\")); 

    } 

    static long GetDirectorySize(DirectoryInfo dir) 
    { 

     long size = 0; 

     foreach(DirectoryInfo d in dir.EnumerateDirectories("*",SearchOption.TopDirectoryOnly)) { 
      size += GetDirectorySize(d); 
     } 

     size += dir.EnumerateFiles("*",SearchOption.TopDirectoryOnly).Sum(fi => fi.Length); 

     if (size > maxSize) 
     { 
      Console.WriteLine("Directory: {0} Size: {1}", dir, size); 
     } 

     return size; 
    } 
+0

我不太喜歡外部數據。因爲所有數據都來自於參數,主要是空白。阻止它工作。 – user3095385

+0

這只是您如何遞歸檢查目錄大小的粗略示例。不過你可以使用這個方法。 –

+0

我一直在測試你的代碼,似乎工作。或多或少。現在唯一的問題是它不寫路徑。你有什麼建議是放置這樣做的路線? – user3095385