C#获取文件夹/文件的大小以及占用空间

今天,头给了个任务:写个方法,我会给你个路径,计算这个路径所占用的磁盘空间 。

然后,找了很多资料。但大部分都是获取文件夹/文件的大小的。对于占用空间的没有成品代码。(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. 查看服务器所有文件大小,查看服务器文件夹下内存大小

    查看服务器文件夹下内存大小 内容精选 换一换 已创建全景分析任务,并且成功完成分析.展开节点列表.可单击右上角的按钮下载全景分析数据.单击节点名称默认打开"总览 "页签,如图1所示 ...

  2. debian 文件夹中文件大小_linux查看目录(文件夹)内容大小

    习惯Terminal没有不知道ls命令的(等同于DOS的dir),经常只是需要查看目录的内容大小,但ls -h显示的只是目录的本身大小,而且很多项内容 ls 在这方面的两个诟病出现了: 小诟1. 显示 ...

  3. python 使用sort()函数和正则表达式(lambda)对os.listdir()获取的文件夹文件列表进行重新排序 乱序排序

    # 排序函数,对文件列表进行排序 # 排序函数,对文件列表进行排序(filenames为文件夹文件的文件名的字符串列表) def sort_filenames(filenames):# (1)可以以l ...

  4. VB 详细枚举指定目录、文件夹文件列表

    VB 详细枚举指定目录.文件夹文件列表: Public Function TheFileAttr(P As String) As String '读取指定文件/文件夹属性     On Error G ...

  5. Python批量修改单个文件夹文件后缀

    今天下载了视频,但是视频格式是.mkv的,唱戏机不支持mkv格式,所以需要将后缀改成.mp4(其他文件格式也可以),由于视频比较多一个一个的更改比较麻烦,所以想到了用python来进行批量修改. 首先 ...

  6. python ftp文件夹文件递归上传推送

    python ftp文件夹文件递归上传推送 posted on 2018-10-16 17:05 秦瑞It行程实录 阅读(...) 评论(...) 编辑 收藏 转载于:https://www.cnbl ...

  7. Python 创建随机名字的文件夹/文件

    Python 创建随机名字的文件夹/文件 导入库 创建文件名 创建文件 导入库 import random import string import os 创建文件名 dir_name = ''.jo ...

  8. php存在文件夹_PHP创建文件夹 PHP判断文件夹文件是否存在

    这篇文章主要为大家详细介绍了PHP创建文件夹 PHP判断文件夹文件是否存在,具有一定的参考价值,感兴趣的小伙伴们可以参考一下,有需要的朋友可以收藏方便以后借鉴. PHP如何创建文件夹?PHP如何判断文 ...

  9. 计算机各个盘的作用,C盘各个文件夹/文件的作用是什么(Win7/Win8/Win10系统)?

    C盘各个文件夹/文件的作用是什么(Win7/Win8/Win10系统)?有些事情,高手不屑于为我们讲解,有些是因为确实有难度.对于系统文件,大多数朋友都会讳莫如深,好像多神秘似的,今天笔者来吃这个螃蟹 ...

最新文章

  1. 单片机编程好学吗?单片机初学者怎样看懂代码?
  2. 代码片段管理器——SnippetsLab
  3. 剑指offer:滑动窗口最大值
  4. java 大顶堆_107-大顶堆和小顶堆图解说明
  5. Python str / bytes / unicode 区别详解 - Python零基础入门教程
  6. html css网页布局实例简单,Div+CSS网页布局项目实战一(含设计图、HTML和CSS源文件)...
  7. 微信公布6月朋友圈十大谣言 包括不打疫苗不让上飞机高铁等
  8. wordpress functions.php 在哪,实用WordPress functions.php代码收藏 – 来自WordPress Answers
  9. Maven基础篇之Maven实战入门-最新IDEA版maven
  10. 数字信号上下采样对频谱影响,以及如何添加相应滤波器
  11. drupal主题开发_开发人员充满了Drupal的活力和活力
  12. 稳压二极管及特性介绍
  13. MTK_android11_WIFI(内网)和4G(外网)共存
  14. matlab graythresh()函数使用的注意点
  15. 自媒体人想要写好实时热点文章,一定要掌握好这三点
  16. 燕教授使用体验,从漱口水到牙膏
  17. godot 顶级游戏引擎
  18. Python程序设计实验——3.检测手机号真实性
  19. 关于watch和computed的执行时机
  20. 零点漂移 时间戳拦截器

热门文章

  1. Logstash 输入源
  2. 2022-2028全球与中国监管技术(RegTech)市场现状及未来发展趋势
  3. M101 Homework 2.2
  4. Can't create table #sql-2e4_14.frm' (errno: 150)
  5. linux如何自建cdn,有哪些用处?
  6. mysql 交叉表查询
  7. 图计算黑科技:打开中文词嵌入训练实践新模式
  8. 40-【什么叫规矩 什么叫体统】内置算法-排序
  9. 三维图形及动画软件开发流程
  10. CorelDRAW X3 标题形状工具