C#FileInfo-此LINQ查询中的附加条件
我正在尝试在此类中创建一个方法,调用该方法时,该方法将扫描Documents文件夹的所有子文件夹,查找名为“Log”的子文件夹,并在这些日志文件夹中查找扩展名为.Log且在过去24小时内创建或修改过的任何文件。这就是我目前所拥有的。假设传入方法的C#FileInfo-此LINQ查询中的附加条件,c#,linq,fileinfo,C#,Linq,Fileinfo,我正在尝试在此类中创建一个方法,调用该方法时,该方法将扫描Documents文件夹的所有子文件夹,查找名为“Log”的子文件夹,并在这些日志文件夹中查找扩展名为.Log且在过去24小时内创建或修改过的任何文件。这就是我目前所拥有的。假设传入方法的字符串路径参数是C:\Users\Me\Documents: using System; using System.Collections.Generic; using System.IO; using System.Linq; namespace F
字符串路径
参数是C:\Users\Me\Documents:
using System;
using System.Collections.Generic;
using System.IO;
using System.Linq;
namespace FileFinder
{
class ModifiedFileFinder
{
static public IEnumerable<FileInfo> GetFilesModifiedInLast24Hours(string path)
{
var directory = new DirectoryInfo(path);
DateTime from_date = DateTime.Now.AddDays(-1);
DateTime to_date = DateTime.Now;
var files = directory.GetFiles("*.*", SearchOption.AllDirectories)
.Where(file => file.LastWriteTime >= from_date && file.LastWriteTime <= to_date);
return files.ToList();
}
}
}
现在的问题是,尽管有
SearchOption.AllDirectories
参数,但该方法肯定没有在子目录中查找。它只返回顶级目录中的文件。有什么想法吗?您可以使用递归查找所有名为“Log”的子文件夹
方法:GetFileModifiedLast24小时
public static IEnumerable<FileInfo> GetFilesModifiedInLast24Hours(string path)
{
var toDate = DateTime.Now;
var fromDate = toDate.AddDays(-1);
var fileInfos = new List<FileInfo>();
var directoryPaths = GetFolders(path);
const string fileExtension = "*.txt";
foreach (var directoryPath in directoryPaths)
{
var directory = new DirectoryInfo(directoryPath);
var files = directory.GetFiles(fileExtension)
.Where(file => file.LastWriteTime >= fromDate && file.LastWriteTime <= toDate)
.ToList();
if (files.Any())
{
fileInfos.AddRange(files);
}
}
return fileInfos;
}
您可以添加一个条件:
file.Directory.Name.Equals(“Log”)
。过滤器在GetFiles(“*.txt”,…)
中指定。您可能应该使用EnumerateFiles()
和yield return…
。或者先枚举目录(),然后是内容。--IMO,&&file.LastWriteTimeDirectoryInfo.EnumerateFiles()
希望将要包含的文件类型的筛选器作为第一个参数;因此,既然您想查找.txt
文件,那么DirectoryInfo.EnumerateFiles(“*.txt”,SearchOption.AllDirectories)
--请注意,SearchOption.AllDirectories
可能很危险:枚举目录树可能需要很长时间。仅当您确定路径不包含重分析点等(因此您永远不会在AppData
或当前用户主文件夹等中使用它)时才使用它。该代码查找扩展名为.log
的文件,其中直接父文件夹名为log
:例如C:\Users\Me\Documents\log\somefile.log
,C:\Users\Me\Documents\SomeFolder\log\someOtherFile.log
等。如果这不是您要查找的目录结构,发布一些示例。我非常确定这个过程将以这种方式查看目录树。查看是否对应该搜索的文件夹结构有一致意见。例如,它找不到C:\Users\Me\Documents\SomeFolder\Log\Other\someOtherFile.Log
。好的。你也考虑过这个案子吗<代码>日志
,日志
和日志
是不同的,您只需要查找日志
。如果目录名可以有不同的大小写,请改用file.Directory.name.Equals(“LOG”,StringComparison.InvariantCultureIgnoreCase)
。文件扩展名不区分大小写。
static void Main(string[] args)
{
const string path = @"C:\Logs\Test";
var files = GetFilesModifiedInLast24Hours(path);
Console.ReadLine();
}
public static IEnumerable<FileInfo> GetFilesModifiedInLast24Hours(string path)
{
var toDate = DateTime.Now;
var fromDate = toDate.AddDays(-1);
var fileInfos = new List<FileInfo>();
var directoryPaths = GetFolders(path);
const string fileExtension = "*.txt";
foreach (var directoryPath in directoryPaths)
{
var directory = new DirectoryInfo(directoryPath);
var files = directory.GetFiles(fileExtension)
.Where(file => file.LastWriteTime >= fromDate && file.LastWriteTime <= toDate)
.ToList();
if (files.Any())
{
fileInfos.AddRange(files);
}
}
return fileInfos;
}
private static List<string> GetFolders(string folderPath)
{
const string folderToFind = "Log";
var folders = new List<string>();
var paths = Directory.GetDirectories(folderPath);
foreach (var path in paths)
{
var directoryName = new DirectoryInfo(path).Name;
if (directoryName == folderToFind)
{
folders.Add(path);
}
if (!IsDirectoryEmpty(path))
{
var subDirectory = GetFolders(path);
if (subDirectory.Any())
{
folders.AddRange(subDirectory);
}
}
}
return folders;
}
private static bool IsDirectoryEmpty(string path)
{
return !Directory.EnumerateFileSystemEntries(path).Any();
}