0

我有一个文件夹,其中包含多个子文件夹,这些子文件夹被命名为(2 位数月份 + 4 位数年份)作为示例。

102018, 062014, 092018, 042016, 072017, 012016

我需要获取一个文件夹列表,以便能够遍历该列表,该列表按名称的年份部分排序,然后按名称的月份部分排序。名称格式始终为 2 位数的月份和 4 位数的年份。

然后应该对列表进行排序

102018, 092018, 072017, 042016, 012016, 062014

我可以使用代码获取列表

string[] SubDirs = Directory.GetDirectories(@"c:\MainFolder\");

但我不知道如何根据需要对文件夹名称进行排序。任何人都可以帮忙吗?

4

4 回答 4

1

试试这个

string[] foldernames = Directory.GetDirectories(@"c:\MainFolder\");
List<DateTime> result =  new List<DateTime>();
foreach (var element in foldernames)
{
    result.Add(DateTime.Parse(element.Substring(0,2)+"-"+element.Substring(2)));
}


result.OrderByDescending(d => d).Select(s => new {SortedFile = s.ToShortDateString().Replace(@"/1/","")});

或者

result.OrderByDescending(d => d).Select(s => 
      s.ToShortDateString().Replace(@"/1/",""));

结果将按您需要的顺序包含名称

于 2018-10-11T16:00:27.703 回答
1

对于指定格式的文件夹名称,您可以使用正则表达式OrderByDescendingThenByDescending方法。例如:

var year = new Regex(@"\d{4}$", RegexOptions.Compiled);
var month = new Regex(@"^\d{2}", RegexOptions.Compiled);
string[] SubDirs = Directory
    .GetDirectories(@"c:\MainFolder\")
    .OrderByDescending(dir => year.Match(dir)?.Value, StringComparer.OrdinalIgnoreCase)
    .ThenByDescending(dir => month.Match(dir)?.Value, StringComparer.OrdinalIgnoreCase)
    .ToArray();
于 2018-10-11T16:00:40.763 回答
1

您可以将日期临时存储为 yyyyMM 并对其进行排序。

为避免提取日期出现问题,我确保目录名称以六位数字开头。

using System;
using System.Linq;
using System.IO;
using System.Text.RegularExpressions;

namespace ConsoleApp1
{
    class Program
    {
        static void Main(string[] args)
        {
            string dirToExamine = @"C:\temp\testDirs";

            /* Get the directories which start with six digits */
            var re = new Regex("^[0-9]{6}");
            var dirs = new DirectoryInfo(dirToExamine).GetDirectories()
                .Where(d => re.IsMatch(d.Name))
                .ToList();

            /* The directory names start MMyyyy but we want them ordered by yyyyMM */
            var withDates = dirs.Select(d => new
            {
                Name = d,
                YearMonth = d.Name.Substring(2, 4) + d.Name.Substring(0, 2)
            })
                .OrderByDescending(f => f.YearMonth, StringComparer.OrdinalIgnoreCase)
                .Select(g => g.Name).ToList();

            Console.WriteLine(string.Join("\r\n", withDates));
            Console.ReadLine();

        }
    }
}

(它可能看起来像很多代码,但我对其进行了格式化以适应该列的宽度。)

我在这些目录名称(用 列出dir /b)上对其进行了测试:

012016abcd
042016
062014
0720179876
092018
102018 Some text

并得到了所需的订购:

102018 Some text
092018
0720179876
042016
012016abcd
062014

然后,如果您想按顺序对每个目录中的文件执行某些操作,这很容易,因为您可以.GetFiles()在 DirectoryInfo 实例上使用:

foreach(var di in withDates)
{
    FileInfo[] files = di.GetFiles();
    foreach(var fil in files)
    {
        Console.WriteLine(fil.Name);
    }
}
于 2018-10-11T18:01:27.557 回答
0

您可以使用Array.Sort,使用第二个参数来提供一个delegate函数,该函数会将字符串分成 3 个部分(年、月日)并返回正确的顺序。

于 2018-10-11T15:43:39.217 回答