C# ASP.Net 获取按部分名称排序的文件夹列表
C# ASP.Net Get Folder List Sorted by Partial Name
我有一个文件夹,其中有许多子文件夹,这些子文件夹的名称都是这样命名的(2 位数月份 + 4 位数年份)作为示例。
102018、062014、092018、042016、072017、012016
我需要获取一个文件夹列表以便能够循环,该列表按名称的年份部分排序,然后按名称的月份部分排序。名称格式始终为 2 位数月份和 4 位数年份。
列表应该像
一样排序
102018、092018、072017、042016、012016、062014
我可以使用代码获取列表
string[] SubDirs = Directory.GetDirectories(@"c:\MainFolder\");
但我不知道如何根据需要对文件夹名称进行排序。有人可以帮忙吗?
您可以使用 Array.Sort
,使用第二个参数提供一个 delegate
函数,它将字符串分成 3 个部分(年、月、日)和 return正确的顺序。
试试这个
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/",""));
结果将按照您需要的顺序包含姓名
对于指定格式的文件夹名称,您可以使用正则表达式,OrderByDescending
and 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();
您可以暂时将日期存储为 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
如果您随后想按顺序对每个目录中的文件执行某些操作,这很容易,因为您可以在 DirectoryInfo 实例上使用 .GetFiles()
:
foreach(var di in withDates)
{
FileInfo[] files = di.GetFiles();
foreach(var fil in files)
{
Console.WriteLine(fil.Name);
}
}
我有一个文件夹,其中有许多子文件夹,这些子文件夹的名称都是这样命名的(2 位数月份 + 4 位数年份)作为示例。
102018、062014、092018、042016、072017、012016
我需要获取一个文件夹列表以便能够循环,该列表按名称的年份部分排序,然后按名称的月份部分排序。名称格式始终为 2 位数月份和 4 位数年份。
列表应该像
一样排序102018、092018、072017、042016、012016、062014
我可以使用代码获取列表
string[] SubDirs = Directory.GetDirectories(@"c:\MainFolder\");
但我不知道如何根据需要对文件夹名称进行排序。有人可以帮忙吗?
您可以使用 Array.Sort
,使用第二个参数提供一个 delegate
函数,它将字符串分成 3 个部分(年、月、日)和 return正确的顺序。
试试这个
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/",""));
结果将按照您需要的顺序包含姓名
对于指定格式的文件夹名称,您可以使用正则表达式,OrderByDescending
and 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();
您可以暂时将日期存储为 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
如果您随后想按顺序对每个目录中的文件执行某些操作,这很容易,因为您可以在 DirectoryInfo 实例上使用 .GetFiles()
:
foreach(var di in withDates)
{
FileInfo[] files = di.GetFiles();
foreach(var fil in files)
{
Console.WriteLine(fil.Name);
}
}