2012-10-28 32 views
0

我使用以下代碼Directory.EnumeratedDirectorties在執行前被推遲了嗎?

var allFolderPaths = Directory.EnumerateDirectories(this.sourceFolder, "*.*", SearchOption.AllDirectories);

我遇到的問題,是foreach循環(如上所示遍歷allFolderPaths變量)期間,它是失敗,因爲目錄中找不到。現在

,下面的代碼是,本身不看目錄等,它只是一個字符串循環:

foreach (string folder in StringList) 
{ 
     /dostuff 
} 

然而,當我更新使用allFolderPaths(可根據在第一個例子的代碼這篇文章)

foreach (string folder in allFolderPaths) 
{ 
     /dostuff 
} 

它由於「訪問被拒絕的路徑」而失敗!

那麼,這是否意味着變量allFolderPaths實際上並沒有被分配給它(如果這有什麼意義)?

回答

2

Directory.EnumerateFiles()返回一個IEnumerable <>只有當您實際枚舉可枚舉...(又名「懶惰執行」)時才執行。

如果您想強制EnumerateFiles立即執行,您可以添加一個.ToList()(又名「memoization」)。

例子:

var allFolders = Directory.EnumerateDirectories(this.sourceFolder, "*.*", SearchOption.AllDirectories).ToList(); 

的原因存取遭拒例外是,你試圖枚舉您沒有權限來枚舉目錄;您正在查看「我的文檔」還是類似的?

+0

哈哈,你知道你的東西;是的,這是造成這個問題的My Documents文件夾 - 這就是爲什麼我試圖通過每個文件夾,一次一個,看看我是否有權限,如果是這樣,將它添加到HavePermisionsList – Dave

+0

你有沒有這是一個解決方案嗎? – Dave

+1

問題文件夾是'假'文件夾:即'我的圖片','我的音樂'等我做了一個'SafeEnumerateDirectory'函數,它將捕獲異常。來源https://gist.github.com/3972045 – Grynn

1

不,這意味着您的進程正試圖訪問它沒有權限的文件/目錄。

1

代碼中的allFolderPaths變量的類型爲IEnumerable<string>。這確實意味着只有使用foreach循環對其進行枚舉時,纔會訪問該磁盤。

在這種情況下,「找不到目錄」異常是不大可能的,因爲它的名字是在毫秒前檢索到的。但並非完全不可能,隨着其他進程訪問磁盤,文件系統可以即時更改。

「訪問被拒絕」異常很有可能,特別是當您迭代驅動器的根目錄時。即使是管理員也無法訪問「系統卷信息」文件夾。你需要捕捉這個異常並繼續。避免它們的一個好方法是使用DirectoryInfo.Attributes。如果目錄是隱藏的和系統的,那麼你幾乎總是想從這樣的目錄中清除。

+0

這是我想我必須避免的;看起來try catch並不是一件好事,應該只是更多地被用作'try-catch - 嘗試別的東西'......但是,我可以使用catch來壓制消息並轉到下一步目錄!它肯定會起作用,但是,那是什麼意思? – Dave

+1

你有使用try/catch和允許機器上的另一個進程隨機崩潰你的程序的基本選擇。後者絕不是錯誤的事情,你可以責怪另一個過程。 –