【问题标题】:Directory.GetFiles get today's files onlyDirectory.GetFiles 只获取今天的文件
【发布时间】:2012-12-13 18:01:20
【问题描述】:

.NET Directory.GetFiles 中有一个很好的功能,当我需要从目录中获取所有文件时使用它很简单。

Directory.GetFiles("c:\\Files")

但是,如果有很多创建时间不同的文件,我如何(什么模式)只获取创建时间今天的文件?

谢谢!

【问题讨论】:

    标签: c# asp.net .net


    【解决方案1】:

    试试这个:

    var todayFiles = Directory.GetFiles("path_to_directory")
                     .Where(x => new FileInfo(x).CreationTime.Date == DateTime.Today.Date);
    

    【讨论】:

      【解决方案2】:

      为了提高性能,尤其是在目录搜索可能很大的情况下,使用 Directory.EnumerateFiles() 懒惰地枚举搜索路径优于 Directory.GetFiles(),它急切地枚举搜索路径,收集所有匹配项在过滤任何之前:

      DateTime today = DateTime.Now.Date ;
      FileInfo[] todaysFiles = new DirectoryInfo(@"c:\foo\bar")
                               .EnumerateFiles()
                               .Select( x => {
                                  x.Refresh();
                                  return x;
                               })
                               .Where( x => x.CreationTime.Date == today || x.LastWriteTime == today )
                               .ToArray()
                               ;
      

      请注意,FileSystemInfo 及其子类型的属性可以(并且是)缓存,因此它们不一定反映当前的实际情况。因此,调用Refresh() 以确保数据正确。

      【讨论】:

      • 如果目录是网络上的 UNC 路径,DirectoryInfo 和 EnumerateFiles 也会快得多:social.msdn.microsoft.com/Forums/vstudio/en-US/…
      • EnumerateFiles().Select 出现错误,其中不包含选择的定义?是那个特定的 .NET 版本吗?
      • @YA 如果您没有拉入命名空间System.Linq,您将看不到Linq 扩展方法。 msdn.microsoft.com/en-us/library/system.linq(v=vs.110).aspx
      • 你可能不会有太多运气,除非你在相等性检查中也只包括今天的日期部分..啊,我知道你已经这样做了
      • @NicholasCarey 为什么将.LastWriteTime 包含在.Where 部分中? OP询问了“今天创造的时间”。我错过了什么?
      【解决方案3】:

      你需要获取文件的目录信息

      public List<String> getTodaysFiles(String folderPath)
      {
          List<String> todaysFiles = new List<String>();
          foreach (String file in Directory.GetFiles(folderPath))
          {
              DirectoryInfo di = new DirectoryInfo(file);
              if (di.CreationTime.ToShortDateString().Equals(DateTime.Now.ToShortDateString()))
                  todaysFiles.Add(file);
          }
          return todaysFiles;
      }
      

      【讨论】:

      • 我建议使用 FileInfoDate.Today,但感谢您指出不使用 LINQ 的正确方法
      • 做得很好,但您也可以使用“CreationTime.Date”成员将文件的日期与 DateTime.Today 进行比较,而不是将每个日期转换为字符串。
      【解决方案4】:

      您可以使用以下代码:

      var directory = new DirectoryInfo("C:\\MyDirectory");
      var myFile = (from f in directory.GetFiles()
                   orderby f.LastWriteTime descending
                   select f).First();
      
      // or...
      var myFile = directory.GetFiles()
                   .OrderByDescending(f => f.LastWriteTime)
                   .First();
      

      请看这里:How to find the most recent file in a directory using .NET, and without looping?

      【讨论】:

        【解决方案5】:

        使用 System.Linq;

        DirectoryInfo info = new DirectoryInfo("");
        FileInfo[] files = info.GetFiles().OrderBy(p => p.CreationTime).ToArray();
        foreach (FileInfo file in files)
        {
            // DO Something...
        }
        

        如果您想将其分解为特定日期,您可以使用过滤器尝试此操作

        var files = from c in directoryInfo.GetFiles() 
                    where c.CreationTime >dateFilter
                    select c;
        

        【讨论】:

          【解决方案6】:

          你应该可以通过这个:

          var loc = new DirectoryInfo("C:\\");
          
          
          var fileList = loc.GetFiles().Where(x => x.CreationTime.ToString("dd/MM/yyyy") == currentDate);
          foreach (FileInfo fileItem in fileList)
          {
              //Process the file
          }
          

          【讨论】:

            【解决方案7】:
            var directory = new DirectoryInfo(Path.GetDirectoryName(@"--DIR Path--"));
            DateTime from_date = DateTime.Now.AddDays(-5);
            DateTime to_date = DateTime.Now.AddDays(5);
            
            //For Today 
            var filesLst = directory.GetFiles().AsEnumerable()
                          .Where(file.CreationTime.Date == DateTime.Now.Date ).ToArray(); 
            
            //For date range + specific file extension 
            var filesLst = directory.GetFiles().AsEnumerable()
                          .Where(file => file.CreationTime.Date >= from_date.Date && file.CreationTime.Date <= to_date.Date && file.Extension == ".txt").ToArray(); 
            
            //To get ReadOnly files from directory  
            var filesLst = directory.GetFiles().AsEnumerable()
                          .Where(file => file.IsReadOnly == true).ToArray(); 
            
            //To get files based on it's size
            int fileSizeInKB = 100; 
            var filesLst = directory.GetFiles().AsEnumerable()
                          .Where(file => (file.Length)/1024 > fileSizeInKB).ToArray(); 
            

            【讨论】:

              猜你喜欢
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              相关资源
              最近更新 更多