【问题标题】:Get directory files, ordered by a date which is part of the file name获取目录文件,按作为文件名一部分的日期排序
【发布时间】:2017-08-16 01:33:09
【问题描述】:

我需要从一个目录中获取所有文件,按文件名中的日期排序:

James_2015.06.27.pdf
Anna_2017.01.17.pdf
Timmy_2017.02.19.pdf

目前,我正在使用它,它仅按Name 对文件进行排序。

 DirectoryInfo info = new DirectoryInfo(path);
 FileInfo[] files = info.GetFiles(filter).OrderBy(p => p.Name).ToArray();

有什么想法可以实现吗?

【问题讨论】:

    标签: c# linq file directory


    【解决方案1】:

    我会创建一个以文件名为键的字典,值将是文件名的子字符串,并且只包含日期。

    您可以循环遍历您的 DirectoryEntrys 并将它们循环添加到字典中,算法将是这样的:

                            string filename1 = "asbdahszd2018.02.01.pdf";
                            string filename2 = "foobar2018.02.01.pdf";
    
                            Dictionary<string, string> myDict = new Dictionary<string,string>();
    
                            myDict.Add(filename1, filename1.Substring(filename1.Length - 14, 10));
                            myDict.Add(filename2, filename2.Substring(filename2.Length - 14, 10));
    
                            myDict.OrderBy(item => item.Value);
    

    【讨论】:

      【解决方案2】:

      需要解析文件名:

      DirectoryInfo info = new DirectoryInfo(path);
      FileInfo[] files = info.GetFiles(filter)
          .OrderBy(p => Path.GetFileNameWithoutExtension(p.FullName).Split('_')[1])
          .ToArray();
      

      但这很容易出错。


      使用 linq

      就像我说的,这很容易出错,我可能会这样写:

      DirectoryInfo info = new DirectoryInfo(path);
      
      
      FileInfo[] files = (from fileInfo in info.GetFiles(filter)
                          let splitted = Path.GetFileNameWithoutExtension(fileInfo.FullName).Split('_')
                          where splitted.Length > 1
                          orderby splitted[1]
                          select fileInfo).ToArray();
      

      更好的方法是解析日期时间并对其进行排序。

      这还将过滤文件名中没有有效日期的文件。

      private DateTime? ParseFilename(FileInfo fileInfo)
      {
          var parts = Path.GetFileNameWithoutExtension(fileInfo.FullName).Split('_');
          if (parts.Length < 1)
              return null;
      
          DateTime result;
      
          if (!DateTime.TryParse(parts[1], out result))
              return null;
      
          return result;
      }
      

      用法:

      DirectoryInfo info = new DirectoryInfo(path);
      
      FileInfo[] files = (from fileInfo in info.GetFiles(filter)
                          let DateTime = ParseFilename(fileInfo)
                          where DateTime.HasValue
                          orderby DateTime.Value
                          select fileInfo).ToArray();
      

      【讨论】:

      • 在:Path.GetFileNameWithoutExtension(p)
      • 仍然无效:p.Name 不存在
      • @KobyDouek 再次更新..(您尝试过什么吗?)
      • 宾果游戏。谢谢先生。
      • @KobyDouek 你可能会检查最后一个版本。
      【解决方案3】:

      这应该适合你:

      DirectoryInfo info = new DirectoryInfo(path);
      FileInfo[] files = info.GetFiles(filter).OrderBy(p => Path.GetFileNameWithoutExtension(p.Name).Split('_').Last()).ToArray();
      

      【讨论】:

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