虽然现在硬盘越来越大,但是清理垃圾还是必要的。这时我们往往需要一个获取文件夹所占空间大小的功能,从而判断垃圾文件的位置。

这个时候,我们常用的在右键属性中查看文件夹所占空间的方法显得效率实在太低。往往需要一些工具来辅助实现这个功能。一般有两个工具可以实现这个功能:diruse和du。diruse是MS在系统中的一个附加的工具,du是sysinternals公司的,不过sysinternals好像已经被MS收购了。这两个工具都是命令行工具,但也保持着MS一贯的简单易用的特点。

这里以diruse为例介绍其用法:

diruse /M /* c:\OTHER

Size (mb)  Files      Directory
2.91     14          SUB-TOTAL: C:\OTHER\BusinessInfo
61.98   1309        SUB-TOTAL: C:\OTHER\software
41.60     41         SUB-TOTAL: C:\OTHER\drivers
0.02     21          SUB-TOTAL: C:\OTHER\work
3.03      9          SUB-TOTAL: C:\OTHER\config
0.00      3          SUB-TOTAL: C:\OTHER\lnetwork
182.16    537        SUB-TOTAL: C:\OTHER\bkup
14.71      6          SUB-TOTAL: C:\OTHER\vpnclient
1.81     60          SUB-TOTAL: C:\OTHER\info
817.20    224        SUB-TOTAL: C:\OTHER\tools
515.25    449        SUB-TOTAL: C:\OTHER\wtnfiles
3089.50  10765       SUB-TOTAL: C:\OTHER\MP3
4730.18  13438       TOTAL

可以非常直观的看到各个文件夹所占的空间。

但是一个非常郁闷的地方是:这两个程序都不支持中文,一旦碰到中文文件夹就晕菜了,无法显示全部路径。作为MS的官方工具,有这个bug确实让人大跌眼镜。没办法,我只好写了个程序来纠正这个bug。

代码

class DirUseInfo
{
    public string Path { get; private set; }
    public int Percent { get; private set; }
    public int FileCount { get; set; }
    public long Size { get; set; }
            
    Lazy<DirUseInfo[]> subDirs;
    public DirUseInfo[] SubDirs { get { return subDirs.Value; } }

private DirUseInfo(string path, long size, int fileCount,int percent)
    {
        this.Path = path;
        this.Size = size;
        this.FileCount = fileCount;
        this.Percent = percent;
        this.subDirs = fileCount == 0 ? new Lazy<DirUseInfo[]>() : new Lazy<DirUseInfo[]>(() => GetDirUseInfo(path));
    }

public override string ToString()
    {
        return string.Format("[{0}% {1} {2}]", Percent, Size, Path);
    }

public static DirUseInfo[] GetDirUseInfo(string dir)
    {
        var subDirs = Directory.GetDirectories(dir);
        var p = Process.Start(new ProcessStartInfo(@"D:\Tools\Du\diruse.exe", @"/* " + dir)
        {
            UseShellExecute = false,
            RedirectStandardOutput = true,
        });    
        p.WaitForExit();

var output = p.StandardOutput.ReadToEnd();
        var matches = Regex.Matches(output, @"(\d+|Access Denied)\s+(\d+).+");

if(subDirs.Length!=matches.Count-1)    //match最后一项是汇总
            throw new InvalidOperationException();

var totalSize = long.Parse(matches[matches.Count - 1].Groups[1].Value);

var dirsUseInfo = new DirUseInfo[subDirs.Length];
        for (int i = 0; i < dirsUseInfo.Length; i++)
        {
            var groups = matches[i].Groups;
            var path = subDirs[i];
            var fileCount = int.Parse(groups[2].Value);
            var size = matches[i].Value.StartsWith("Access Denied") ? 0 : long.Parse(groups[1].Value);
            var percent = (int)(size * 100 / totalSize);

dirsUseInfo[i] = new DirUseInfo(path, size, fileCount, percent);
        }

return dirsUseInfo;
    }
}

原理很简单,仅仅是用C#把diruse的输出封装和匹配了一下,使其生成一个DirUseInfo的对象,利用diruse的输出获取了一些常用的信息。从而可以集成到windows程界面的程序中去。我自己用的时候是用wpf写了一个界面的,不过还不是很令人满意,就不献丑了。这里就仅仅提供一下diruse的封装,以供有同样需求的朋友参考。

转载于:https://www.cnblogs.com/TianFang/archive/2010/12/10/1902636.html

获取文件夹所占空间的大小相关推荐

  1. linux如何查询一个文件夹大小,Linux下如何查看某个文件夹所占空间大小

    Linux下的du命令可以查看某个目录或者文件所占空间大小. 基础知识: 命令参数: -a或-all 显示目录中个别文件的大小. -b或-bytes 显示目录或文件大小时,以byte为单位. -c或- ...

  2. C#获取文件夹及文件的大小与占用空间的方法

    本文详细介绍了利用C#实现根据路径,计算这个路径所占用的磁盘空间的方法 . 网上有很多资料都是获取文件夹/文件的大小的.对于占用空间的很少有完整的代码.这里介绍实现这一功能的完整代码,供大家参考一下. ...

  3. C#获取文件夹/文件的大小以及占用空间 转摘自:http://www.cnblogs.com/chenpeng-dota/articles/2176470.html...

    C#获取文件夹/文件的大小以及占用空间 今天,头给了个任务:写个方法,我会给你个路径,计算这个路径所占用的磁盘空间 . 然后,找了很多资料.但大部分都是获取文件夹/文件的大小的.对于占用空间的没有成品 ...

  4. 如何查看文件夹占用的空间大小 Windows

    如何查看文件夹占用的空间大小 Windows 可以使用 Folder Size,扫描过后是这样的

  5. php排大小函数,PHP获取文件夹大小函数

    // 获取文件夹大小 function getDirSize($dir) { $handle = opendir($dir); while (false!==($FolderOrFile = read ...

  6. Windows上获取文件大小的几种方法及获取文件夹大小方法

    文章来自:https://blog.csdn.net/mfcing/article/details/53184921 获取文件大小 Windows提供了好几个API函数来获取文件大小,还可以使用标准C ...

  7. Windows开发--获取文件大小及获取文件夹大小的方法

    获取文件大小 Windows提供了好几个API函数来获取文件大小,还可以使用标准C和标准C++库函数来获取(当然了,标准库函数的底层实现也是调用了Windows API函数,效率上可能有所影响). c ...

  8. linux 获取文件夹下文件信息,linux下获取文件夹下子文件列表

    linux下获取文件夹下子文件列表 预置条件: 1.只遍历当前目前,不遍历当前目录的子文件夹 2.根据用户提供的开始时间戳以及持续时间,返回在这个时间区间内被修改过的文件列表. 相关知识: 1.str ...

  9. python 获取文件夹所有文件列表_python获取文件夹下所有文件及os模块方法

    python获取文件夹下所有文件 方法一:使用os.listdir import os for filename in os.listdir(r'c:\windows'): print filenam ...

最新文章

  1. Altium Designer原理图模板设计
  2. 使用硬件定时器软模拟多个定时器(8.15改进版)
  3. 面试准备工作 -戈多编程
  4. 哈希表查找速度为什么那么快?快在哪里了?
  5. 很多人都不知道,其实博客园给我们博客开了二级域名
  6. Android NFS文件系统挂载遇到的问题解决方法
  7. python3 文件模式
  8. % mysql 代表_MySQL中的星号(*)和百分号(%)代表表示什么,MySQL的库名、表名、字段名、字段值是否区分大...
  9. 前端学习(3081):vue+element今日头条管理-创建页面组件并加载
  10. 2.4一元多项式的表示及相加,含cpp算法
  11. (5)通过Node.js 运行JS代码
  12. 基于spiking卷积的脉冲时间编码
  13. Hyper-V的安装准备
  14. JS控制图片滚动的效果
  15. python的简单实用小工具(未完待续......)
  16. 特稿:OceanBase 连破纪录的背后,是技术人的砥砺前行 | 凌云时刻
  17. Linux操作系统原理— 进程与线程管理
  18. 关于virtualbox无法复制粘贴的问题
  19. 2020计算机专硕考数二的学校,2020考研备考:考研数一、数二、数三哪个最难?...
  20. xtrareport 修改行颜色

热门文章

  1. cad图纸目录自动生成插件_如何自动生成论文目录?
  2. jpa 查找最后一条数据_查找数据的最后1条记录,你用了2小时,同事1分钟就搞定了...
  3. ios 圆形旋转菜单_iOS高级动画:圆形树展开收起动画
  4. openstack mysql 故障_Openstack mysql自发连接错误2006,“mysql服务器已经离开
  5. 多线程处理list_数组两元素的最大差:从暴力到多线程
  6. 开发日记-20190608 关键词 读书笔记《鸟哥的Linux私房菜-基础学习篇》
  7. TLS 改变密码标准协议(Change Cipher Spec Protocol) 就是加密传输中每隔一段时间必须改变其加解密参数的协议...
  8. leetcode 169. Majority Element
  9. jdk1.8中接口可以写默认方法
  10. 互联网金融乱弹4:讨论金融系统日切处理