C#获取文件夹及文件的大小与占用空间的方法
本文详细介绍了利用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; }