我想根据名称对文件夹进行分组。我不想将它们移动到单独的文件夹中或更改目录中的任何内容。为了更清晰的显示目的,我想将它们大致分为两个文件夹。文件夹名称为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;
}
答案 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;