C#获取文件夹及文件的大小与占用空间的方法

时间:2021-05-20

本文详细介绍了利用C#实现根据路径,计算这个路径所占用的磁盘空间的方法 。

网上有很多资料都是获取文件夹/文件的大小的。对于占用空间的很少有完整的代码。这里介绍实现这一功能的完整代码,供大家参考一下。

首先说下文件夹/文件大小与占用空间的区别。

这个是硬盘分区格式有关 大小是文件的实际大小,而占用空间是占硬盘的实际空间 以FAT32格式为例,硬盘的基本存储单位是簇,在FAT32中一簇是4KB 那么,也就是说即使文件只有1个字节,在硬盘上也要占到4KB的空间 如果文件是4KB零1个字节,那就要占用8KB的空间,以此类推。

结论: 大小是文件的实际大小,而占用空间是占硬盘的实际空间。

那么问题来了。怎样获取本机的簇有多少字节呢?

首先可以通过windows API获取磁盘的相关信息。

//调用windows API获取磁盘空闲空间//导入库[DllImport("kernel32.dll", CharSet = CharSet.Auto)]static extern bool GetDiskFreeSpace([MarshalAs(UnmanagedType.LPTStr)]string rootPathName,ref int sectorsPerCluster, ref int bytesPerSector, ref int numberOfFreeClusters, ref int totalNumbeOfClusters);

下面是具体代码:

/// <summary>/// 获取指定路径的大小/// </summary>/// <param name="dirPath">路径</param>/// <returns></returns>public static long GetDirectoryLength(string dirPath){long len = 0;//判断该路径是否存在(是否为文件夹)if (!Directory.Exists(dirPath)){//查询文件的大小len = FileSize(dirPath);}else{//定义一个DirectoryInfo对象DirectoryInfo di = new DirectoryInfo(dirPath);//通过GetFiles方法,获取di目录中的所有文件的大小foreach (FileInfo fi in di.GetFiles()){len += fi.Length;}//获取di中所有的文件夹,并存到一个新的对象数组中,以进行递归DirectoryInfo[] dis = di.GetDirectories();if (dis.Length > 0){for (int i = 0; i < dis.Length; i++){len += GetDirectoryLength(dis[i].FullName);}}}return len;}/// <summary>/// 获取指定路径的占用空间/// </summary>/// <param name="dirPath">路径</param>/// <returns></returns>public static long GetDirectorySpace(string dirPath){//返回值long len = 0;//判断该路径是否存在(是否为文件夹)if (!Directory.Exists(dirPath)){//如果是文件,则调用len = FileSpace(dirPath);}else{//定义一个DirectoryInfo对象DirectoryInfo di = new DirectoryInfo(dirPath);//本机的簇值long clusterSize = GetClusterSize(di);//遍历目录下的文件,获取总占用空间foreach (FileInfo fi in di.GetFiles()){//文件大小除以簇,余若不为0if (fi.Length % clusterSize != 0){decimal res = fi.Length / clusterSize;//文件大小除以簇,取整数加1。为该文件占用簇的值int clu = Convert.ToInt32(Math.Ceiling(res)) + 1;long result = clusterSize * clu;len += result;}else{//余若为0,则占用空间等于文件大小len += fi.Length;}}//获取di中所有的文件夹,并存到一个新的对象数组中,以进行递归DirectoryInfo[] dis = di.GetDirectories();if (dis.Length > 0){for (int i = 0; i < dis.Length; i++){len += GetDirectorySpace(dis[i].FullName);}}}return len;}//所给路径中所对应的文件大小public static long FileSize(string filePath){//定义一个FileInfo对象,是指与filePath所指向的文件相关联,以获取其大小FileInfo fileInfo = new FileInfo(filePath);return fileInfo.Length;}//所给路径中所对应的文件占用空间public static long FileSpace(string filePath){long temp = 0;//定义一个FileInfo对象,是指与filePath所指向的文件相关联,以获取其大小FileInfo fileInfo = new FileInfo(filePath);long clusterSize = GetClusterSize(fileInfo);if (fileInfo.Length % clusterSize != 0){decimal res = fileInfo.Length / clusterSize;int clu = Convert.ToInt32(Math.Ceiling(res)) + 1;temp = clusterSize * clu;}else{return fileInfo.Length;}return temp;}public static DiskInfo GetDiskInfo(string rootPathName){DiskInfo diskInfo = new DiskInfo();int sectorsPerCluster = 0, bytesPerSector = 0, numberOfFreeClusters = 0, totalNumberOfClusters = 0;GetDiskFreeSpace(rootPathName, ref sectorsPerCluster, ref bytesPerSector, ref numberOfFreeClusters, ref totalNumberOfClusters);//每簇的扇区数diskInfo.SectorsPerCluster = sectorsPerCluster;//每扇区字节diskInfo.BytesPerSector = bytesPerSector;return diskInfo;}//// <summary>/// 结构。硬盘信息/// </summary>public struct DiskInfo{public string RootPathName;//每簇的扇区数public int SectorsPerCluster;//每扇区字节public int BytesPerSector;public int NumberOfFreeClusters;public int TotalNumberOfClusters;}/// <summary>/// 获取每簇的字节/// </summary>/// <param name="file">指定文件</param>/// <returns></returns>public static long GetClusterSize(FileInfo file){long clusterSize = 0;DiskInfo diskInfo = new DiskInfo();diskInfo = GetDiskInfo(file.Directory.Root.FullName);clusterSize = (diskInfo.BytesPerSector * diskInfo.SectorsPerCluster);return clusterSize;}/// <summary>/// 获取每簇的字节/// </summary>/// <param name="dir">指定目录</param>/// <returns></returns>public static long GetClusterSize(DirectoryInfo dir){long clusterSize = 0;DiskInfo diskInfo = new DiskInfo();diskInfo = GetDiskInfo(dir.Root.FullName);clusterSize = (diskInfo.BytesPerSector * diskInfo.SectorsPerCluster);return clusterSize;}

声明:本页内容来源网络,仅供用户参考;我单位不保证亦不表示资料全面及准确无误,也不保证亦不表示这些资料为最新信息,如因任何原因,本网内容或者用户因倚赖本网内容造成任何损失或损害,我单位将不会负任何法律责任。如涉及版权问题,请提交至online#300.cn邮箱联系删除。

相关文章