2016-10-17 48 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; 
     } 
    } 
相关问题