C#获取文件夹/文件的大小以及占用空间 转摘自:http://www.cnblogs.com/chenpeng-dota/articles/2176470.html...
今天,头给了个任务:写个方法,我会给你个路径,计算这个路径所占用的磁盘空间 。
然后,找了很多资料。但大部分都是获取文件夹/文件的大小的。对于占用空间的没有成品代码。(ps:我没找到。)后来,在网上找了些资料,自己捣鼓出来了。在这里记录下,一则说不定以后能用到。再则如果有高手有更好的方法或者建议,求指点。
废话不多说了。begin。
首先说下文件夹/文件大小与占用空间的区别。
这个是硬盘分区格式有关 大小是文件的实际大小,而占用空间是占硬盘的实际空间 以FAT32格式为例,硬盘的基本存储单位是簇,在FAT32中一簇是4KB 那么,也就是说即使文件只有1个字节,在硬盘上也要占到4KB的空间 如果文件是4KB零1个字节,那就要占用8KB的空间,以此类推 结论: 大小是文件的实际大小,而占用空间是占硬盘的实际空间。(ps:偷了一下懒,直接百度知道了。)
那么问题来了。怎样获取本机的簇有多少字节呢?
首先通过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;
}
|
转载于:https://www.cnblogs.com/prettyisshit/p/4150409.html
C#获取文件夹/文件的大小以及占用空间 转摘自:http://www.cnblogs.com/chenpeng-dota/articles/2176470.html...相关推荐
- 查看服务器所有文件大小,查看服务器文件夹下内存大小
查看服务器文件夹下内存大小 内容精选 换一换 已创建全景分析任务,并且成功完成分析.展开节点列表.可单击右上角的按钮下载全景分析数据.单击节点名称默认打开"总览 "页签,如图1所示 ...
- debian 文件夹中文件大小_linux查看目录(文件夹)内容大小
习惯Terminal没有不知道ls命令的(等同于DOS的dir),经常只是需要查看目录的内容大小,但ls -h显示的只是目录的本身大小,而且很多项内容 ls 在这方面的两个诟病出现了: 小诟1. 显示 ...
- python 使用sort()函数和正则表达式(lambda)对os.listdir()获取的文件夹文件列表进行重新排序 乱序排序
# 排序函数,对文件列表进行排序 # 排序函数,对文件列表进行排序(filenames为文件夹文件的文件名的字符串列表) def sort_filenames(filenames):# (1)可以以l ...
- VB 详细枚举指定目录、文件夹文件列表
VB 详细枚举指定目录.文件夹文件列表: Public Function TheFileAttr(P As String) As String '读取指定文件/文件夹属性 On Error G ...
- Python批量修改单个文件夹文件后缀
今天下载了视频,但是视频格式是.mkv的,唱戏机不支持mkv格式,所以需要将后缀改成.mp4(其他文件格式也可以),由于视频比较多一个一个的更改比较麻烦,所以想到了用python来进行批量修改. 首先 ...
- python ftp文件夹文件递归上传推送
python ftp文件夹文件递归上传推送 posted on 2018-10-16 17:05 秦瑞It行程实录 阅读(...) 评论(...) 编辑 收藏 转载于:https://www.cnbl ...
- Python 创建随机名字的文件夹/文件
Python 创建随机名字的文件夹/文件 导入库 创建文件名 创建文件 导入库 import random import string import os 创建文件名 dir_name = ''.jo ...
- php存在文件夹_PHP创建文件夹 PHP判断文件夹文件是否存在
这篇文章主要为大家详细介绍了PHP创建文件夹 PHP判断文件夹文件是否存在,具有一定的参考价值,感兴趣的小伙伴们可以参考一下,有需要的朋友可以收藏方便以后借鉴. PHP如何创建文件夹?PHP如何判断文 ...
- 计算机各个盘的作用,C盘各个文件夹/文件的作用是什么(Win7/Win8/Win10系统)?
C盘各个文件夹/文件的作用是什么(Win7/Win8/Win10系统)?有些事情,高手不屑于为我们讲解,有些是因为确实有难度.对于系统文件,大多数朋友都会讳莫如深,好像多神秘似的,今天笔者来吃这个螃蟹 ...
最新文章
- 单片机编程好学吗?单片机初学者怎样看懂代码?
- 代码片段管理器——SnippetsLab
- 剑指offer:滑动窗口最大值
- java 大顶堆_107-大顶堆和小顶堆图解说明
- Python str / bytes / unicode 区别详解 - Python零基础入门教程
- html css网页布局实例简单,Div+CSS网页布局项目实战一(含设计图、HTML和CSS源文件)...
- 微信公布6月朋友圈十大谣言 包括不打疫苗不让上飞机高铁等
- wordpress functions.php 在哪,实用WordPress functions.php代码收藏 – 来自WordPress Answers
- Maven基础篇之Maven实战入门-最新IDEA版maven
- 数字信号上下采样对频谱影响,以及如何添加相应滤波器
- drupal主题开发_开发人员充满了Drupal的活力和活力
- 稳压二极管及特性介绍
- MTK_android11_WIFI(内网)和4G(外网)共存
- matlab graythresh()函数使用的注意点
- 自媒体人想要写好实时热点文章,一定要掌握好这三点
- 燕教授使用体验,从漱口水到牙膏
- godot 顶级游戏引擎
- Python程序设计实验——3.检测手机号真实性
- 关于watch和computed的执行时机
- 零点漂移 时间戳拦截器