按名称是按字母顺序还是数字对文件夹进行分组

本文关键字:文件夹 顺序 数字 | 更新日期: 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;