C#獲得文件夾及文件的年夜小與占用空間的辦法。本站提示廣大學習愛好者:(C#獲得文件夾及文件的年夜小與占用空間的辦法)文章只能為提供參考,不一定能成為您想要的結果。以下是C#獲得文件夾及文件的年夜小與占用空間的辦法正文
本文具體引見了應用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()) { //文件年夜小除以簇,余若不為0 if (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; }