如何在搜索计算机的所有驱动器后获取最新的文本文件
问题描述:
我试图在我的计算机中获取最新的文本文件。 我需要去每台计算机的每个驱动器并搜索所有文本文件,并且只需要获取最新的一个文件。如何在搜索计算机的所有驱动器后获取最新的文本文件
我尝试了一些代码,得到一个错误,也不能确定最新的文件,从所有的驱动都可以工作或不
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活动
答
我认为(这是真的很难测试在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
}
“不断增加迪尔斯的列表的末尾,你通过搜索迪尔斯将是一个更容易调试过
答
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;
}
}
}
圣莫里,这将使用大量的内存,我不会为此烦扰LINQ,也许不会递归。有一个需要处理的目录列表和一个FileInfo变量,在每个文件夹中列出内容,添加将文件夹放在列表末尾,然后列出所有文件,并在文件夹中查找最高日期fileinfo,如果日期比进程外的fileinfo变量更新ing循环,使新的fileinfo成为一个比较对象 –