本文详细介绍了利用C#实现根据路径,计算这个路径所占用的磁盘空间的方法。
网上有很多资料都是获取文件夹/文件的大小的。对于占用空间的很少有完整的代码。这里介绍实现这一功能的完整代码,供大家参考一下。
首先说下文件夹/文件大小与占用空间的区别。
这个是硬盘分区格式有关大小是文件的实际大小,而占用空间是占硬盘的实际空间以FAT32格式为例,硬盘的基本存储单位是簇,在FAT32中一簇是4KB那么,也就是说即使文件只有1个字节,在硬盘上也要占到4KB的空间如果文件是4KB零1个字节,那就要占用8KB的空间,以此类推。
结论:大小是文件的实际大小,而占用空间是占硬盘的实际空间。
那么问题来了。怎样获取本机的簇有多少字节呢?
首先可以通过windowsAPI获取磁盘的相关信息。
//调用windowsAPI获取磁盘空闲空间 //导入库 [DllImport("kernel32.dll",CharSet=CharSet.Auto)] staticexternboolGetDiskFreeSpace([MarshalAs(UnmanagedType.LPTStr)]stringrootPathName, refintsectorsPerCluster,refintbytesPerSector,refintnumberOfFreeClusters,refinttotalNumbeOfClusters);
下面是具体代码:
///<summary> ///获取指定路径的大小 ///</summary> ///<paramname="dirPath">路径</param> ///<returns></returns> publicstaticlongGetDirectoryLength(stringdirPath) { longlen=0; //判断该路径是否存在(是否为文件夹) if(!Directory.Exists(dirPath)) { //查询文件的大小 len=FileSize(dirPath); } else { //定义一个DirectoryInfo对象 DirectoryInfodi=newDirectoryInfo(dirPath); //通过GetFiles方法,获取di目录中的所有文件的大小 foreach(FileInfofiindi.GetFiles()) { len+=fi.Length; } //获取di中所有的文件夹,并存到一个新的对象数组中,以进行递归 DirectoryInfo[]dis=di.GetDirectories(); if(dis.Length>0) { for(inti=0;i<dis.Length;i++) { len+=GetDirectoryLength(dis[i].FullName); } } } returnlen; } ///<summary> ///获取指定路径的占用空间 ///</summary> ///<paramname="dirPath">路径</param> ///<returns></returns> publicstaticlongGetDirectorySpace(stringdirPath) { //返回值 longlen=0; //判断该路径是否存在(是否为文件夹) if(!Directory.Exists(dirPath)) { //如果是文件,则调用 len=FileSpace(dirPath); } else { //定义一个DirectoryInfo对象 DirectoryInfodi=newDirectoryInfo(dirPath); //本机的簇值 longclusterSize=GetClusterSize(di); //遍历目录下的文件,获取总占用空间 foreach(FileInfofiindi.GetFiles()) { //文件大小除以簇,余若不为0 if(fi.Length%clusterSize!=0) { decimalres=fi.Length/clusterSize; //文件大小除以簇,取整数加1。为该文件占用簇的值 intclu=Convert.ToInt32(Math.Ceiling(res))+1; longresult=clusterSize*clu; len+=result; } else { //余若为0,则占用空间等于文件大小 len+=fi.Length; } } //获取di中所有的文件夹,并存到一个新的对象数组中,以进行递归 DirectoryInfo[]dis=di.GetDirectories(); if(dis.Length>0) { for(inti=0;i<dis.Length;i++) { len+=GetDirectorySpace(dis[i].FullName); } } } returnlen; } //所给路径中所对应的文件大小 publicstaticlongFileSize(stringfilePath) { //定义一个FileInfo对象,是指与filePath所指向的文件相关联,以获取其大小 FileInfofileInfo=newFileInfo(filePath); returnfileInfo.Length; } //所给路径中所对应的文件占用空间 publicstaticlongFileSpace(stringfilePath) { longtemp=0; //定义一个FileInfo对象,是指与filePath所指向的文件相关联,以获取其大小 FileInfofileInfo=newFileInfo(filePath); longclusterSize=GetClusterSize(fileInfo); if(fileInfo.Length%clusterSize!=0) { decimalres=fileInfo.Length/clusterSize; intclu=Convert.ToInt32(Math.Ceiling(res))+1; temp=clusterSize*clu; } else { returnfileInfo.Length; } returntemp; } publicstaticDiskInfoGetDiskInfo(stringrootPathName) { DiskInfodiskInfo=newDiskInfo(); intsectorsPerCluster=0,bytesPerSector=0,numberOfFreeClusters=0,totalNumberOfClusters=0; GetDiskFreeSpace(rootPathName,refsectorsPerCluster,refbytesPerSector,refnumberOfFreeClusters,reftotalNumberOfClusters); //每簇的扇区数 diskInfo.SectorsPerCluster=sectorsPerCluster; //每扇区字节 diskInfo.BytesPerSector=bytesPerSector; returndiskInfo; } ////<summary> ///结构。硬盘信息 ///</summary> publicstructDiskInfo { publicstringRootPathName; //每簇的扇区数 publicintSectorsPerCluster; //每扇区字节 publicintBytesPerSector; publicintNumberOfFreeClusters; publicintTotalNumberOfClusters; } ///<summary> ///获取每簇的字节 ///</summary> ///<paramname="file">指定文件</param> ///<returns></returns> publicstaticlongGetClusterSize(FileInfofile) { longclusterSize=0; DiskInfodiskInfo=newDiskInfo(); diskInfo=GetDiskInfo(file.Directory.Root.FullName); clusterSize=(diskInfo.BytesPerSector*diskInfo.SectorsPerCluster); returnclusterSize; } ///<summary> ///获取每簇的字节 ///</summary> ///<paramname="dir">指定目录</param> ///<returns></returns> publicstaticlongGetClusterSize(DirectoryInfodir) { longclusterSize=0; DiskInfodiskInfo=newDiskInfo(); diskInfo=GetDiskInfo(dir.Root.FullName); clusterSize=(diskInfo.BytesPerSector*diskInfo.SectorsPerCluster); returnclusterSize; }
您可能感兴趣的文章:C#递归实现显示文件夹及所有文件并计算其大小的方法将文件夹下所有文件输出到日志文件中c#递归算法学习示例C#对文件与文件夹的操作包括删除、移动与复制C#将文件复制到指定文件夹并整理c#递归遍历文件夹示例C#监控文件夹变化的方法C#简单遍历指定文件夹中所有文件的方法C#搜索文字在文件及文件夹中出现位置的方法c#删除所有的空文件夹的小例子C#显示文件夹下所有图片文件的方法C#实现获取文件夹大小的方法C#编程实现统计文件夹内文件和隐藏文件的方法示例
C++中strcpy函数的实现
浅谈C++基类的析构函数为虚函数
上述就是C#学习教程:C#获取文件夹及文件的大小与占用空间的方法分享的全部内容,如果对大家有所用处且需要了解更多关于C#学习教程,希望大家多多关注—计算机技术网(www.ctvol.com)!
本文来自网络收集,不代表计算机技术网立场,如涉及侵权请联系管理员删除。
ctvol管理联系方式QQ:251552304
本文章地址:https://www.ctvol.com/cdevelopment/905520.html