C#获取文件夹所占空间大小的功能

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

这个时候,我们常用的在右键属性中查看文件夹所占空间的方法显得效率实在太低。往往需要一些工具来辅助实现这个功能。一般有两个工具可以实现这个功能: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的封装,以供有同样需求的朋友参考。

到此这篇关于C#获取文件夹所占空间大小的文章就介绍到这了。希望对大家的学习有所帮助,也希望大家多多支持我们。

(0)

相关推荐

  • C#实现获取文件夹大小的方法

    本文实例讲述了C#实现获取文件夹大小的方法.分享给大家供大家参考.具体如下: 当然了,首先都需要引入System.IO这个命名空间 第一个方法: public static long GetDirectoryLength(string dirPath) { //判断给定的路径是否存在,如果不存在则退出 if (!Directory.Exists(dirPath)) return 0; long len = 0; //定义一个DirectoryInfo对象 DirectoryInfo di = n

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

    本文详细介绍了利用C#实现根据路径,计算这个路径所占用的磁盘空间的方法 . 网上有很多资料都是获取文件夹/文件的大小的.对于占用空间的很少有完整的代码.这里介绍实现这一功能的完整代码,供大家参考一下. 首先说下文件夹/文件大小与占用空间的区别. 这个是硬盘分区格式有关 大小是文件的实际大小,而占用空间是占硬盘的实际空间 以FAT32格式为例,硬盘的基本存储单位是簇,在FAT32中一簇是4KB 那么,也就是说即使文件只有1个字节,在硬盘上也要占到4KB的空间 如果文件是4KB零1个字节,那就要占用

  • C#递归实现显示文件夹及所有文件并计算其大小的方法

    算法中递归的一个典型应用就是遍历目标文件夹,并把该文件夹下的所有文件和文件夹打印或显示出来,还可以递归计算出目标文件夹的总大小.本文即以实例形式展示了C#递归实现显示目标文件夹的所有文件和文件夹,并计算目标文件夹的大小的方法. 具体实现代码如下: class Program { static void Main(string[] args) { Console.WriteLine("输入目标文件夹"); string path = Console.ReadLine(); FindFol

  • C#获取文件夹所占空间大小的功能

    虽然现在硬盘越来越大,但是清理垃圾还是必要的.这时我们往往需要一个获取文件夹所占空间大小的功能,从而判断垃圾文件的位置. 这个时候,我们常用的在右键属性中查看文件夹所占空间的方法显得效率实在太低.往往需要一些工具来辅助实现这个功能.一般有两个工具可以实现这个功能:diruse和du.diruse是MS在系统中的一个附加的工具,du是sysinternals公司的,不过sysinternals好像已经被MS收购了.这两个工具都是命令行工具,但也保持着MS一贯的简单易用的特点. 这里以diruse为

  • PHP获取文件夹大小函数用法实例

    本文实例讲述了PHP获取文件夹大小函数用法.分享给大家供大家参考.具体如下: <?php // 获取文件夹大小 function getDirSize($dir) { $handle = opendir($dir); while (false!==($FolderOrFile = readdir($handle))) { if($FolderOrFile != "." && $FolderOrFile != "..") { if(is_dir(

  • asp.net 获取文件夹中的图片的代码

    前台: 复制代码 代码如下: <asp:DataList ID="DataList1" runat="server" RepeatDirection="Horizontal" RepeatColumns="5" CellSpacing="25"> <ItemTemplate> <img src="<%# Eval("FullName") %&

  • php文件操作小结(删除指定文件/获取文件夹下的文件名/读取文件夹下图片名)

    本文实例分析了php文件操作的方法.分享给大家供大家参考,具体如下: 一.删除文件 unlink() 语法: int unlink(string filename); 返回值: 整数 函数种类: 文件存取.如: unlink("tmp/test.txt"); 二.获取文件夹下面的文件名 $dir = "message/"; // 文件夹的名称 if (is_dir($dir)){ if ($dh = opendir($dir)){ while (($file = r

  • PHP获取文件夹内文件数的方法

    本文实例讲述了PHP获取文件夹内文件数的方法.分享给大家供大家参考.具体实现方法如下: function getfilecounts($ff){ $dir = './'.$ff; $handle = opendir($dir); $i = 0; while(false !== $file=(readdir($handle))){ if($file !== '.' && $file != '..') { $i++; } } closedir($handle); return $i; } 希望

  • Java获取文件夹下所有文件名称的方法示例

    本文实例讲述了Java获取文件夹下所有文件名称的方法.分享给大家供大家参考,具体如下: import java.io.File; public class GetFoldFileNames { /** * * @author zdz8207 */ public static void main(String[] args) { getFileName(); } public static void getFileName() { String path = "G:/lxz/20130611&qu

  • C#编程实现获取文件夹中所有文件的文件名

    本文实例讲述了C#编程实现获取文件夹中所有文件的文件名.分享给大家供大家参考,具体如下: 想实现这样一个功能:批量修改一个目录所有jpg文件的文件名,在其原始基础上加上特定字符串 我先把一个目录里所有的格式为jpg的文件名存储到数组里,然后统一修改数组值来批量修改jpg文件的文件名 代码如下: using System; using System.IO; namespace ConsoleApplication7 { /// <summary> /// Class1 的摘要说明. /// &l

  • Linux Shell获取文件夹下的文件名方法

    有时候需要获取某个文件夹下的所有文件名,可以用程序实现,但是打开IDE,编译运行太麻烦,在Linux服务器中通常不能打开IDE,此时可以用几行简单的shell命令来实现,结果保存到某个文件中即可. Shell脚本如下: #!/bin/bash # get all filename in specified path path=$1 files=$(ls $path) for filename in $files do echo $filename >> filename.txt done 以上

随机推荐