2017-11-18 60 views
-1

我试图在我的计算机中获取最新的文本文件。 我需要去每台计算机的每个驱动器并搜索所有文本文件,并且只需要获取最新的一个文件。如何在搜索计算机的所有驱动器后获取最新的文本文件

我尝试了一些代码,得到一个错误,也不能确定最新的文件,从所有的驱动都可以工作或不

try 
     { 
      foreach (DriveInfo d in DriveInfo.GetDrives()) 
      { 
       var X = GetLatestFiles(d.Name, "*.txt"); 

      } 
     } 
     catch (Exception ex) { Console.WriteLine(ex); } 


public static FileInfo GetLatestFiles(string path, string searchPattern) 
    { 
     return Directory.EnumerateFiles(path, searchPattern).Union(
      Directory.EnumerateDirectories(path).SelectMany(d => 
      { 
       try 
       { 
        return GetLatestFiles(d, searchPattern); 
       } 
       catch (UnauthorizedAccessException) 
       { 
        return Enumerable.Empty<String>(); 
       } 
      })).OrderByDescending(f => (f == null ? DateTime.MinValue : f.LastWriteTime)).FirstOrDefault(); 
    } 

错误

的类型参数的方法“Enumerable.SelectMany (IEnumerable,Func>)' 不能从使用情况推断。尝试明确指定类型参数 。 ConsoleApp1 C:\用户\ H190733 \源\回购\ ConsoleApp1 \ ConsoleApp1 \ Program.cs的43活动

+1

圣莫里,这将使用大量的内存,我不会为此烦扰LINQ,也许不会递归。有一个需要处理的目录列表和一个FileInfo变量,在每个文件夹中列出内容,添加将文件夹放在列表末尾,然后列出所有文件,并在文件夹中查找最高日期fileinfo,如果日期比进程外的fileinfo变量更新ing循环,使新的fileinfo成为一个比较对象 –

回答

0

我认为(这是真的很难测试在iPhone上,对不起),如果你

return (FileInfo)null; 

而不是

return Enumerable.Empty<String>(); 

然后错误就会消失。

您可能还需要致电.SelectMany<FileInfo>。我的评论立场;这是一个可怕的方式来搜索你的整个驱动器。下面的伪代码转换为C#是我的建议:

//declare list<directoryinfo> dirs 
//declare FileInfo latestText 

//load all drives into the dirs list 

//loop over the list with "while the list has more entries" type loop 
while(dirs.Count>0){ 
    // load all the directories in dirs[0] onto the end of the list 

    //For each fileinfo in dirs[0] if the create time 
    //is more recent than latestText createTime, 
    //set latestText to that fileinfo 

    //remove first entry from dirs 

} 

“不断增加迪尔斯的列表的末尾,你通过搜索迪尔斯将是一个更容易调试过

0
 FileInfo newestTextFile = null; 
     foreach (DriveInfo d in DriveInfo.GetDrives()) 
     { 
      var root = d.RootDirectory; 
      var files = root.EnumerateFiles("*.txt", SearchOption.AllDirectories); 
      forearch (var file in files) 
      { 
       if (newestTextFile == null || file.LastAccessTime > newestTextFile.LastAccessTime) 
       { 
        newestTextFile = file; 
       } 
      } 
     } 
相关问题