C#程序估算文件夹大小
介绍
本文将讲解用C#编写程序来估算文件夹大小。在我们的电脑中,我们将文件存储在一个称为文件夹的目录中。我们还将了解如何估算文件夹中存在的文件夹大小。仅计算文件大小是不够的,我们还需要计算文件夹和子文件夹的大小。
以下文章将讲解如何分三部分计算文件夹大小。第一部分我们将了解GetFolderSize方法这将给我们提供文件夹大小。第二部分将是FormatBytes方法,它将把大小转换成人类可读格式。我们还将简要了解不同的方法,这些方法在文章进一步阅读时将非常重要。
方法
我们将学习五种方法,用于在代码中计算文件夹的大小。
- DirectoryInfo(dir_path) − 该方法以目录路径作为输入参数,并返回有关文件和子文件夹和子目录的信息。
-
GetFiles() − 返回单个目录的所有文件的名称。
-
Length − 返回以字节为单位的文件大小。
-
GetDirectories() − 该方法将在我们的代码中大量使用,因为它返回单个文件的所有文件夹、子文件夹和子目录。
除了这些将直接在我们的代码中使用的方法之外,还有一个方法考虑到输出控制台非常重要。
- FormatBytes() − Length方法取出的大小是以字节为单位的,不是以人类可读的格式 。因此,我们需要使用FormatBytes方法将其转换为适当的字符串格式。该方法以字节为输入,根据需求将其转换为MB或KB,然后四舍五入到两个小数位,最后将其转换为字符串。
我们还将了解DirectoryInfo类的运作方式及其在代码中的用途。
它允许在文件或目录中执行多个操作。可以使用此类创建、移动和删除文件。它属于System.Io命名空间。它甚至提供了与文件一起使用的方法。
算法
步骤1 − 我们必须首先获取单个位置中的所有文件。这里我们将所有的文件存储在所有文件变量中。
步骤2 − 现在我们将通过循环遍历所有文件并通过Length方法计算每个文件的长度来移动到所有文件。
步骤3 − 现在我们必须确保不会漏掉文件夹中存在的子目录、子文件夹和文件夹。
步骤4 − 我们递归地向每个文件移动,检查它们是否包含任何子目录、子文件夹或文件夹。
步骤5 − 我们现在将计算其中每个文件的长度并将其存储在总文件夹大小变量中。
步骤6 − 现在,我们必须确保使用格式化字节方法,以将最终答案转换为人类可读格式,从字节大小转换为字符串格式。
步骤7 − 最后,我们可以使用console函数打印答案。
示例
using System;
using System.IO;
Class Tutorials_point{
// 驱动程序
static public void Main() {
DirectoryInfo folder = new DirectoryInfo("D://d2c articles");
//在这里我们得到了完整的文件夹信息。
// 这是一个类,用于获取有关目录的完整信息。
long totalFolderSize = folderSize(folder);
// 此处调用了folderSize,并将答案存储在totalFolderSize变量中。
long ans= FormatBytes(totalFolderSize);
// 在这里我们调用FormatBytes函数,将字节大小格式化为可读格式。
Console.WriteLine("Total folder size in bytes: " + ans);
// 最终答案被打印出来。
}
static long folderSize(DirectoryInfo folder) {
long totalSizeOfDir = 0;
// 获取目录中的所有文件
FileInfo[] allFiles = folder.GetFiles();
// 循环遍历每个文件并获取其大小
foreach (FileInfo file in allFiles) {
totalSizeOfDir += file.Length;
// 在这里计算长度。
}
DirectoryInfo[] subFolders = folder.GetDirectories();
// 在这里,我们查看文件中是否存在子文件夹或目录。
foreach (DirectoryInfo dir in subFolders) {
totalSizeOfDir += folderSize(dir);
// 在这里,我们递归调用来检查所有子文件夹。
}
return totalSizeOfDir;
// 我们返回总大小在这里。
}
}
public static string FormatBytes(long bytes) {
/*此方法基本上用于确定文件的大小。它首先确定我们是否必须在字节,KB,MB或GB中完成。如果大小在1KB和1MB之间,那么我们将计算KB的大小。同样,如果在MB和GB之间,则将其计算为MB。*/
string[] sizes = { "bytes", "KB", "MB", "GB", "TB" };
// 在这里,我们将所有大小存储在字符串中。
int order = 0;
// 我们使用零初始化顺序,以便它不返回一些垃圾值。
while (bytes >= 1024 && order < sizes.Length - 1) {
order++;
bytes /= 1024;
}
return $"{bytes:0.##} {sizes[order]}";
}
输出
Total folder size in bytes:850757
时间复杂度
在上面的代码中,我们看到我们唯一迭代的循环是递归循环。在该递归循环中,我们看到只有在到达所有子文件夹、文件、目录、子目录和文件夹时才进行迭代。因此,这形成了O(文件大小)的时间复杂度。除此之外,所有其他方法都只需要常量时间复杂度。这导致 Big-O 表示法时间复杂度为O(1)。因此,最终时间复杂度仅是文件夹的总大小。
结论
在本文中,我们广泛讨论了如何计算文件夹的大小。我们理解了在我们的代码中所使用的不同方法和类。我们还了解到只计算文件大小是不够的。我们还必须确保计算所有文件夹、目录、子目录和子文件夹的大小。我们还理解了代码的算法、代码本身以及时间复杂度。我们希望本文对增强您对C#的知识有所帮助。