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;
}