c# - C# FileInfo - 此 LINQ 查询中的附加条件
问题描述
我正在尝试在此类中创建一个方法,该方法在调用时将扫描 Documents 文件夹的所有子文件夹,找到任何名为“Log”的子文件夹,并在这些 Log 文件夹中,找到任何具有 .log 扩展名的文件,并具有在过去 24 小时内创建或修改。这是我到目前为止所拥有的。假设string path
传入方法的参数是 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();
}
}
}
我相信我已经处理了“过去 24 小时”的要求,但是我正在努力解决的是如何表明我只希望该GetFiles
方法在名为 Log 的子文件夹中查找,并且只针对具有 .txt 扩展名的文件。
编辑#1:
在@Jimi 下面的评论的帮助下,我离我更近了,但似乎只是少了一步。这是更新的代码:
using System;
using System.Collections.Generic;
using System.IO;
using System.Linq;
namespace CGLogFiles
{
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.EnumerateFiles("*.log", SearchOption.AllDirectories)
.Where(file => file.Directory.Name.Equals("Log") && file.LastWriteTime >= from_date && file.LastWriteTime <= to_date);
return files.ToList();
}
}
}
SearchOption.AllDirectories
现在的问题是,尽管有争论,但该方法肯定没有在子目录中查找。它仅从顶级目录返回文件。有什么想法吗?
解决方案
您可以使用递归查找所有名为“Log”的子文件夹
static void Main(string[] args)
{
const string path = @"C:\Logs\Test";
var files = GetFilesModifiedInLast24Hours(path);
Console.ReadLine();
}
方法:GetFilesModifiedInLast24Hours
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();
}
推荐阅读
- angular - VSCode 终端中的“Ctrl + 单击以跟随链接”不会跳转到源文件但会打开新的浏览器选项卡
- php - 多维数组,同一个key的值求和
- ansible - 是否有一个 Ansible 模块可以帮助在启动后保存 iptables 配置
- php - 如何获取从未完成的数据
- intellij-idea - Intellij:“无法自动装配。有多个 'MyType' 类型的 bean”使用 @ConditionalOnProperty
- python - 谷歌分析查询与视图相关的维度和指标列表
- flutter - 定义floatingActionButtonLocation时如何使用堆栈添加FAB?
- php - 当 MySQL 数据库中没有图像“BLOB”时,我想显示“No Image”
- laravel - 在 laravel 中使用错误的 ttp 请求类型(例如 get 而不是 post)时返回 404
- excel - 根据今天的日期和特定时间范围过滤数据