2016-10-17 49 views
-1

在我的下載文件應用我收到Stackoverflow Exception as Unhandled當我通過遍歷目錄來獲取文件的詳細信息和重命名&移動文件到某個文件夾我的代碼是DirectoryInfo.GetFiles拋出未處理StackOverflowException

public FileInfo GetNewestFile() 
{ 
    try 
    { 
     System.IO.DirectoryInfo directory = new DirectoryInfo(TempDownloadFolder); 

     FileInfo result = null; 
     var list = directory.GetFiles(); // Stackoverflow Exception occurs here 
     if (list.Count() > 0) 
     { 
      result = list.OrderByDescending(f => f.LastWriteTime).First(); 
     } 
     return result; 
    } 
    catch (Exception ex) 
    { 

     throw ex; 
    } 
}    

即應用程序下載PDFMS-Word文件從一個網站,如果它下載PDF文件順序directory.GetFiles()工作正常,但當它下載1個或多個PDF文件,然後下載一個MS-Word文件應用程序拋出System.Stackoverflow異常。

當我重新啓動應用程序下載MS-Word文件作爲其是在陣容的第一個文件它運作良好,只有等到以後幾個文件已被下載

至於另一MS-Word`文件出現後下載我所知的例外狀況是因爲巨大的內存分配,但我想不通爲什麼它不發生的PDF文件,但只發生了MS-Word文件

編輯:

我用了返回最新的文件上面的代碼是

return di.GetFiles() 
     .Union(di.GetDirectories().Select(d => GetNewestFile())) 
     .OrderByDescending(f => (f == null ? DateTime.MinValue : f.LastWriteTime)) 
     .FirstOrDefault(); 

上面的代碼也導致異常#1

+0

一個文件夾名稱溫度是否有其他應用程序/方法不斷寫TempDownloadFolder? – Martheen

+0

@Martheen是的文件將被多次downloded到'TempDownloadFolder',但重命名後它將被移動到永久下載文件夾 – Rajesh

+0

結合他的評論使用簡單的循環來獲取最新的文件的PeterB答案可以通過避免更新文件,並且只保留在內存上的最大兩個文件屬性 – Martheen

回答

2

請嘗試directory.EnumerateFiles(),而不是directory.GetFiles()。然後,也可以使用.Any()而不是.Count() > 0

它們的區別如下:

  • 當您使用EnumerateFiles,你可以返回整個集合之前開始枚舉的FileInfo對象的集合。
  • 當您使用GetFiles時,必須等待返回整個FileInfo對象數組才能訪問該數組。 因此,當您使用許多文件和目錄時,EnumerateFiles可以更高效。

從這個MSDN頁:https://msdn.microsoft.com/en-us/library/4cyf24ss(v=vs.110).aspx

+0

有了OrderByDescending,它不需要枚舉整個集合麼? – Martheen

+1

確實很可能,我沒有注意到這個電話。但是可以很容易地使用循環來重寫,以便查找並保存最新的文件,而不是一次將所有文件保存在內存中(原始代碼中會發生這種情況)。 –

+0

順便提一句,[EnumerateFiles](http://stackoverflow.com/questions/29555761/what-happens-with-directory-enumeratefiles-is-directory-content-changes-during-i)跳過已刪除的文件並忽略新文件(如果有)迭代期間發生變化。後來來自OP提及文件的評論不斷下載,所以EnumerateFiles可能是完美的解決方案,它忽略了連續添加的文件並避免了堆棧溢出異常 – Martheen

-1

你應該檢查你TempDownloadFolder字符串值。 對我來說它工作正常。

創建斌/調試/臨時項目目錄

public FileInfo GetNewestFile() 
    { 
     try 
     { 
      System.IO.DirectoryInfo directory = new DirectoryInfo(@"Temp"); 

      FileInfo result = null; 
      var list = directory.GetFiles(); // Stackoverflow Exception occurs here 
      if (list.Count() > 0) 
      { 
       result = list.OrderByDescending(f => f.LastWriteTime).First(); 
      } 
      return result; 
     } 
     catch (Exception ex) 
     { 

      throw ex; 
     } 
    } 
相關問題