按名称是按字母顺序还是数字对文件夹进行分组
本文关键字:文件夹 顺序 数字 | 更新日期: 2023-09-27 18:36:19
我想根据文件夹的名称对文件夹进行分组。我不想将它们移动到单独的文件夹中或更改目录中的任何内容。只是为了更清晰的显示目的,我想将它们大致分组到两个文件夹中。文件夹名称为字母和数字。
目前,我的代码正在获取所有文件夹名称及其大小以及总大小。所以功能保持不变,但不是列出所有文件夹,而是我想分组并显示这样的东西-
Total size: xx.xx MB
Name: Alpa
Size: xx.xx MB
Name: Numb
Size: xx.xx MB
感谢您对使这段代码更好的建议。
下面是我正在使用的代码。
static void Main(string[] args)
{
DirectoryInfo dir = new DirectoryInfo(@"D'temp");
long sizeOnDisk = DiskSize(dir, true);
Console.WriteLine("Total Size: " + "{0:N2} MB", ((double)sizeOnDisk) / (1024 * 1024));
foreach (DirectoryInfo folder in dir.EnumerateDirectories())
{
long sizeOfFolder = DiskSize(folder, true);
Console.WriteLine("Name: " + "{0}", folder.Name);
Console.WriteLine("Size: " + "{0:N2} MB", ((double)sizeOfFolder) / (1024 * 1024));
}
Console.ReadLine();
}
static long DiskSize(DirectoryInfo dir, bool includeSubDir)
{
long totalSize = dir.EnumerateFiles()
.Sum(file => file.Length);
if (includeSubDir)
{
totalSize += dir.EnumerateDirectories()
.Sum(dirt => DiskSize(dirt, true));
}
return totalSize;
}
假设(因为您没有直接询问)要将名称实际上是数字的文件夹与具有非数字名称的文件夹分组,则可以使用具有适当密钥生成方法的GroupBy
操作来执行此操作。
数字文件名的简单测试是使用TryParse
方法之一。 以防万一你有非常大的数字,我会用long.TryParse
来确定这个名字是否是一个数字。 因此,您可以像这样创建组:
DirectoryInfo dir = new DirectoryInfo(@"D:'Temp");
long v;
var folderGroups = dir.EnumerateDirectories().GroupBy(d =>
long.TryParse(d.Name, out v) ? "Number" : "Alpha"
);
这将为您提供一组按String
键分组的DirectoryInfo
记录。 现在你只需要得到尺寸。 而不是遍历文件夹树的递归方法,您可以在一次调用中获取树中所有文件的完整列表,对结果求和并生成一个可以枚举的序列,如下所示:
var groupSizes = folderGroups
.OrderBy(grp => grp.Key)
.Select(grp =>
new {
Name = grp.Key,
Size = grp.Sum(d =>
// this is the bit that gets all of the files
d.EnumerateFiles("*", SearchOption.AllDirectories)
.Sum(f => f.Length))
}
)
.ToArray();
我们可以对上述内容求和以获得总数,然后将其作为单独的记录添加回去,为您提供一个可以在一个循环中输出的结果数组:
var results = new[] { new { Name = "Total", Size = groupSizes.Sum(grp => grp.Size) } }
.Concat(groupSizes);
foreach (var row in results)
{
Console.WriteLine("Name: {0}", row.Name);
Console.WriteLine("Size: {0:#,0.00} MB", row.Size / 1048576d);
}
在我的测试中产生:
Name: Total
Size: 795.09 MB
Name: Alpha
Size: 137.46 MB
Name: Number
Size: 657.63 MB
够近吗?
获取目录名称的第一个字符并在其上使用 Parse。 然后,您知道要将大小添加到哪个文件夹总数。
string firstChar = "1"; //or whatever the first character of your folder name is
int num;
if (Int32.TryParse(firstChar,num))
NumbFolderSize += dir.Size;
else
AlpaFolderSize += dir.Size;