C#FileInfo-此LINQ查询中的附加条件

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

我正在尝试在此类中创建一个方法,调用该方法时,该方法将扫描Documents文件夹的所有子文件夹,查找名为“Log”的子文件夹,并在这些日志文件夹中查找扩展名为.Log且在过去24小时内创建或修改过的任何文件。这就是我目前所拥有的。假设传入方法的
字符串路径
参数是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.LastWriteTime
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
。好的。你也考虑过这个案子吗<代码>日志
日志
日志
是不同的,您只需要查找
日志
。如果目录名可以有不同的大小写,请改用
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();
}