根据文件夹的名称是按字母顺序还是数字来对文件夹进

时间:2016-02-25 22:35:39

标签: c#

我想根据名称对文件夹进行分组。我不想将它们移动到单独的文件夹中或更改目录中的任何内容。为了更清晰的显示目的,我想将它们大致分为两个文件夹。文件夹名称为Alpha和数字。

目前我的代码是获取所有文件夹名称及其大小以及总大小。因此功能保持不变,但不是列出我想要分组的所有文件夹,而是显示类似这样的内容 -

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;
}

2 个答案:

答案 0 :(得分:0)

假设(因为您没有直接询问)您想要将名称实际为数字的文件夹与具有非数字名称的文件夹分组,您可以使用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"
);

这将为您提供一组按DirectoryInfo键分组的String条记录。现在你只需要获得尺寸。您可以在一次调用中获取树中所有文件的完整列表,而不是遍历文件夹树的递归方法,对结果求和并生成可以枚举的序列,如下所示:

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

足够近?

答案 1 :(得分:-1)

抓住目录名的第一个字符并在其上使用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;