首页 > 解决方案 > 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现在的问题是,尽管有争论,但该方法肯定没有在子目录中查找。它仅从顶级目录返回文件。有什么想法吗?

标签: c#linqfileinfo

解决方案


您可以使用递归查找所有名为“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();
}

推荐阅读