C# ASP.Net Получить список папок, отсортированный по частичному имени
У меня есть папка, которая имеет несколько подпапок, которые названы как таковые (2 цифры месяц + 4 цифры год) в качестве примера.
102018, 062014, 092018, 042016, 072017, 012016
Мне нужно получить список папок, чтобы иметь возможность циклически проходить, отсортированный по годовой части имени, а затем по месячной части имени. Формат имени всегда состоит из двухзначного месяца и четырехзначного года.
Список должен быть отсортирован как
102018, 092018, 072017, 042016, 012016, 062014
Я могу использовать код, чтобы получить список
string[] SubDirs = Directory.GetDirectories(@"c:\MainFolder\");
но я не знаю, как сортировать имена папок, как мне нужно. Кто-нибудь может помочь?
4 ответа
Вы можете временно сохранить дату как 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);
}
}
Для указанного формата имен папок вы можете использовать регулярные выражения, OrderByDescending
а также ThenByDescending
методы. Например:
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();
Попробуй это
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/",""));
результат будет содержать имена в нужном вам порядке
Ты можешь использовать Array.Sort
, используя второй параметр, чтобы обеспечить delegate
функция, которая разделит строку на 3 части (год, день месяца) и вернет правильный порядок.