C#獲取文件夾及文件的大小與占用空間的方法
本文詳細(xì)介紹了利用C#實(shí)現(xiàn)根據(jù)路徑,計(jì)算這個(gè)路徑所占用的磁盤空間的方法 。
網(wǎng)上有很多資料都是獲取文件夾/文件的大小的。對(duì)于占用空間的很少有完整的代碼。這里介紹實(shí)現(xiàn)這一功能的完整代碼,供大家參考一下。
首先說(shuō)下文件夾/文件大小與占用空間的區(qū)別。
這個(gè)是硬盤分區(qū)格式有關(guān) 大小是文件的實(shí)際大小,而占用空間是占硬盤的實(shí)際空間 以FAT32格式為例,硬盤的基本存儲(chǔ)單位是簇,在FAT32中一簇是4KB 那么,也就是說(shuō)即使文件只有1個(gè)字節(jié),在硬盤上也要占到4KB的空間 如果文件是4KB零1個(gè)字節(jié),那就要占用8KB的空間,以此類推。
結(jié)論: 大小是文件的實(shí)際大小,而占用空間是占硬盤的實(shí)際空間。
那么問(wèn)題來(lái)了。怎樣獲取本機(jī)的簇有多少字節(jié)呢?
首先可以通過(guò)windows API獲取磁盤的相關(guān)信息。
//調(diào)用windows API獲取磁盤空閑空間 //導(dǎo)入庫(kù) [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 { //定義一個(gè)DirectoryInfo對(duì)象 DirectoryInfo di = new DirectoryInfo(dirPath); //通過(guò)GetFiles方法,獲取di目錄中的所有文件的大小 foreach (FileInfo fi in di.GetFiles()) { len += fi.Length; } //獲取di中所有的文件夾,并存到一個(gè)新的對(duì)象數(shù)組中,以進(jìn)行遞歸 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)) { //如果是文件,則調(diào)用 len = FileSpace(dirPath); } else { //定義一個(gè)DirectoryInfo對(duì)象 DirectoryInfo di = new DirectoryInfo(dirPath); //本機(jī)的簇值 long clusterSize = GetClusterSize(di); //遍歷目錄下的文件,獲取總占用空間 foreach (FileInfo fi in di.GetFiles()) { //文件大小除以簇,余若不為0 if (fi.Length % clusterSize != 0) { decimal res = fi.Length / clusterSize; //文件大小除以簇,取整數(shù)加1。為該文件占用簇的值 int clu = Convert.ToInt32(Math.Ceiling(res)) + 1; long result = clusterSize * clu; len += result; } else { //余若為0,則占用空間等于文件大小 len += fi.Length; } } //獲取di中所有的文件夾,并存到一個(gè)新的對(duì)象數(shù)組中,以進(jìn)行遞歸 DirectoryInfo[] dis = di.GetDirectories(); if (dis.Length > 0) { for (int i = 0; i < dis.Length; i++) { len += GetDirectorySpace(dis[i].FullName); } } } return len; } //所給路徑中所對(duì)應(yīng)的文件大小 public static long FileSize(string filePath) { //定義一個(gè)FileInfo對(duì)象,是指與filePath所指向的文件相關(guān)聯(lián),以獲取其大小 FileInfo fileInfo = new FileInfo(filePath); return fileInfo.Length; } //所給路徑中所對(duì)應(yīng)的文件占用空間 public static long FileSpace(string filePath) { long temp = 0; //定義一個(gè)FileInfo對(duì)象,是指與filePath所指向的文件相關(guān)聯(lián),以獲取其大小 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); //每簇的扇區(qū)數(shù) diskInfo.SectorsPerCluster = sectorsPerCluster; //每扇區(qū)字節(jié) diskInfo.BytesPerSector = bytesPerSector; return diskInfo; } //// <summary> /// 結(jié)構(gòu)。硬盤信息 /// </summary> public struct DiskInfo { public string RootPathName; //每簇的扇區(qū)數(shù) public int SectorsPerCluster; //每扇區(qū)字節(jié) public int BytesPerSector; public int NumberOfFreeClusters; public int TotalNumberOfClusters; } /// <summary> /// 獲取每簇的字節(jié) /// </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> /// 獲取每簇的字節(jié) /// </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; }
相關(guān)文章
解決用Aspose.Words,在word文檔中創(chuàng)建表格的實(shí)現(xiàn)方法
本篇文章是對(duì)利用Aspose.Words,在word文檔中創(chuàng)建表格的實(shí)現(xiàn)方法進(jìn)行了詳細(xì)的分析介紹,需要的朋友參考下2013-05-05C#中的char、string和StringBuilder的使用詳解
這篇文章主要介紹了C#中的char、string和StringBuilder的使用詳解,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧2020-07-07C#使用Twain協(xié)議開(kāi)發(fā)一個(gè)高掃儀對(duì)接功能
這篇文章主要為大家詳細(xì)介紹了C#如何使用Twain協(xié)議開(kāi)發(fā)一個(gè)高掃儀對(duì)接功能,文中的示例代碼講解詳細(xì),感興趣的小伙伴可以跟隨小編一起學(xué)習(xí)一下2024-02-02WPF使用DrawingContext實(shí)現(xiàn)繪制刻度條
這篇文章主要為大家詳細(xì)介紹了如何利用WPF DrawingContext實(shí)現(xiàn)繪制刻度條,文中的示例代碼講解詳細(xì),對(duì)我們學(xué)習(xí)或工作有一定幫助,感興趣的小伙伴可以了解一下2022-09-09