C # ASP.Net Получить список папок, отсортированный по частичному имени - PullRequest
0 голосов
/ 11 октября 2018

У меня есть папка с несколькими подпапками, которые в качестве примера названы так (2 цифры месяц + 4 цифры года).

102018, 062014, 092018, 042016, 072017, 012016

Мне нужно получить список папок, чтобы иметь возможность циклически проходить, отсортированный по годовой части имени, а затем по месячной части имени.Формат имени всегда состоит из двухзначного месяца и четырехзначного года.

Затем список должен быть отсортирован следующим образом:

102018, 092018, 072017, 042016, 012016, 062014

Я могу использовать код для получения списка

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

, но я не знаю, как сортировать имена папок по мере необходимости.Кто-нибудь может помочь?

Ответы [ 4 ]

0 голосов
/ 11 октября 2018

Вы можете временно сохранить дату как ггггММ и отсортировать по ней.

Чтобы избежать проблем при извлечении даты, я убедился, что имя каталога начинается с шести цифр.

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);
    }
}
0 голосов
/ 11 октября 2018

Попробуйте это

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/",""));

результат будет содержать имена в нужном вам порядке

0 голосов
/ 11 октября 2018

Для указанного формата имен папок вы можете использовать регулярные выражения, методы 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();
0 голосов
/ 11 октября 2018

Вы можете использовать Array.Sort, используя второй параметр для предоставления функции delegate, которая разделит строку на 3 части (год, день месяца) и вернет правильный порядок.

...