C#获取文件夹所占空间大小的功能
作者:天方 发布时间:2022-12-02 10:54:15
虽然现在硬盘越来越大,但是清理垃圾还是必要的。这时我们往往需要一个获取文件夹所占空间大小的功能,从而判断垃圾文件的位置。
这个时候,我们常用的在右键属性中查看文件夹所占空间的方法显得效率实在太低。往往需要一些工具来辅助实现这个功能。一般有两个工具可以实现这个功能: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、XML布局引入<com.net168.lib.SortTabLayout android:id=&quo
- 网络中数据传输经常是xml或者json,现在做的一个项目之前调其他系统接口都是返回的xml格式,刚刚遇到一个返回json格式数据的接口,通过
- 说明:基于atguigu学习笔记。在了解spring boot自动配置原理前,再来了解下两个注解@Import注解和@Conditional
- 1、pom.xml配置修改<packaging>jar</packaging>//修改为<packaging&
- 本文实例讲述了C#实现的简单随机数产生器功能。分享给大家供大家参考,具体如下:运行效果如下:具体代码如下:using System;usin
- private void Value_ByteArray(){double doublevalue = 258.0;Int32 intval
- 本文以实例形式讲述了基于Java的图的广度优先遍历算法实现方法,具体方法如下:用邻接矩阵存储图方法:1.确定图的顶点个数和边的个数2.输入顶
- 本文实例讲述了C#获取真实IP地址实现方法,分享给大家供大家参考。具体实现方法如下:通常来说,大家获取用户IP地址常用的方法是:string
- 目录 * 仓库的配置1、 下载sonatype Nexus来搭建 * 2 安装nexus服务3、创建 * 仓库4、配置 * 信息中央仓库的配置三个仓
- 本文实例为大家分享了WPF实现轮播图切换效果的具体代码,供大家参考,具体内容如下实现效果如下:步骤:1、自定义控件MyImageContro
- 图片象对:经过理处过的jpg格式的位图(头像照片) 算
- 我们先来看看公众号发放现金红包的效果:需要调用商户平台的接口,接口发放规则如下:1.发送频率限制——默认1800/min 2.发送个数上限—
- 哈夫曼(Huffman)编码是一种常用的压缩编码方法,是 Huffman 于 1952 年为压缩文本文件建立的。它的基本原理是频繁使用的数据
- 本文实例讲述了Android编程实现读取本地SD卡图片的方法。分享给大家供大家参考,具体如下:private Bitmap getDiskB
- 面试题一:判断下列程序运行结果package String_test;public class test_1 { public static
- 一、概述 在C和C++语言中都有assert关键,表示断言。在Java中,同样也有assert关键字,表示断言,用法和含义都差不多
- 这篇文章是博主在通过学习Android Studio的同时,实现service项目中用于背景音乐的实现,邮件的发送用于随堂小测的发送邮件功能
- 理解hashCode() 的作用是获取哈希码,也称为散列码;它实际上是返回一个int整数。这个哈希码的作用是确定该对象在哈希表中的索引位置。
- 不一致,那么用来接收查询出来的result对应的数据将会是Null,如果不使用resultMap,那么一般为了避免pojo对象对应的属性为N
- 本文实例为大家分享了Android实现简单点赞动画的具体代码,供大家参考,具体内容如下思路1、找到Activity中DecorView的Ro