【发布时间】:2021-02-21 19:22:49
【问题描述】:
我正在尝试在此类中创建一个方法,该方法在调用时将扫描 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 参数,但该方法肯定不在子目录中查找。它仅从顶级目录返回文件。有什么想法吗?
【问题讨论】:
-
您可以添加条件:
file.Directory.Name.Equals("Log")。过滤器在GetFiles("*.txt", ...)中指定。您可能应该使用EnumerateFiles()和yield return...。或者先EnumerateDirectories(),然后是内容。 --- IMO,&& file.LastWriteTime <= to_date不是必需的。 -
DirectoryInfo.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。 -
好的。你也考虑过这种情况吗?
Log、log和LOG是不同的,您正在寻找的只是Log。如果目录名称可以有不同的大小写,请改用file.Directory.Name.Equals("LOG", StringComparison.InvariantCultureIgnoreCase)。文件扩展名不区分大小写。