-
C#教程之C#获取文件夹及文件的大小与占用空间的
本文详细介绍了利用C#实现根据路径,计算这个路径所占用的磁盘空间的方法 。
网上有很多资料都是获取文件夹/文件的大小的。对于占用空间的很少有完整的代码。这里介绍实现这一功能的完整代码,供大家参考一下。
首先说下文件夹/文件大小与占用空间的区别。
这个是硬盘分区格式有关 大小是文件的实际大小,而占用空间是占硬盘的实际空间 以FAT32格式为例,硬盘的基本存储单位是簇,在FAT32中一簇是4KB 那么,也就是说即使文件只有1个字节,在硬盘上也要占到4KB的空间 如果文件是4KB零1个字节,那就要占用8KB的空间,以此类推。
结论: 大小是文件的实际大小,而占用空间是占硬盘的实际空间。
那么问题来了。怎样获取本机的簇有多少字节呢?
首先可以通过windows API获取磁盘的相关信息。
1
2
3
4
5
|
//调用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); |
下面是具体代码:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
|
/// <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; } |
栏目列表
最新更新
nodejs爬虫
Python正则表达式完全指南
爬取豆瓣Top250图书数据
shp 地图文件批量添加字段
爬虫小试牛刀(爬取学校通知公告)
【python基础】函数-初识函数
【python基础】函数-返回值
HTTP请求:requests模块基础使用必知必会
Python初学者友好丨详解参数传递类型
如何有效管理爬虫流量?
SQL SERVER中递归
2个场景实例讲解GaussDB(DWS)基表统计信息估
常用的 SQL Server 关键字及其含义
动手分析SQL Server中的事务中使用的锁
openGauss内核分析:SQL by pass & 经典执行
一招教你如何高效批量导入与更新数据
天天写SQL,这些神奇的特性你知道吗?
openGauss内核分析:执行计划生成
[IM002]Navicat ODBC驱动器管理器 未发现数据
初入Sql Server 之 存储过程的简单使用
这是目前我见过最好的跨域解决方案!
减少回流与重绘
减少回流与重绘
如何使用KrpanoToolJS在浏览器切图
performance.now() 与 Date.now() 对比
一款纯 JS 实现的轻量化图片编辑器
关于开发 VS Code 插件遇到的 workbench.scm.
前端设计模式——观察者模式
前端设计模式——中介者模式
创建型-原型模式