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

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;

}

时间: 2024-10-22 00:07:59

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

JavaSE 文件递归之删除&amp;amp;获取文件夹文件夹中全部的以.jpg的文件的绝对路径

1.递归删除文件 假设一个文件夹以下还有子文件夹,进行删除的话会 报错,这个时候要使用递归的方式来删除这个文件文件夹中的全部文件以及文件夹 package cn.itcast.digui; import java.io.File; /** * 递归删除demo目录中全部文件包含目录 * 分析: * A:封装目录 * B:获取改目录下的全部文件或者目录 * C:遍历改file数组,得到每个File对象 * D:推断该file对象是都是目录 * 是:回到B * 否:删除 * @author Admi

linux,Mac下 ls 查看目录(文件夹)内容大小

习惯Terminal没有不知道ls命令的(等同于DOS的dir),经常只是需要查看目录的内容大小,但ls -h显示的只是目录的本身大小,而且很多项内容 ls 在这方面的两个诟病出现了: 小诟1. 显示的信息很全,我们只提取Size和Name两列,分别是第5和9列 但是发现不对,像Edge的话起码有200G,但是为什么显示的是306B,说明ls只是显示目录的本身大小,不显示内容大小 大诟2. 不显示目录的实际大小,要显示目录(文件夹)的内容大小,需要用到du(disk utility的缩写)来显示

java基础IO删除文件夹文件

/** * 定义一个方法,能够删除任意文件夹,文件夹路径由键盘录入 注意:不要在C盘下做测试,请选定无用的文件夹测试! */ 1.键盘录入 private static File getfile() { //键盘录入 Scanner sc = new Scanner(System.in); System.out.println("请输入文件夹的路径:"); while(true){ //无限循环 直到输入对了结束 String str = sc.nextLine(); //把字符串封装

CFileDialog 打开文件夹文件 保存文件夹文件

格式说明: explicit CFileDialog( BOOL bOpenFileDialog,                         //TRUE 为打开, FALSE 为保存 LPCTSTR lpszDefExt = NULL,                 // 默认文件扩展名 LPCTSTR lpszFileName = NULL,            //文件对话框中 初始的文件名称 DWORD dwFlags = OFN_HIDEREADONLY | OFN_OVER

Shell脚本递归打印指定文件夹中全部文件夹文件

#!/bin/bash #递归打印当前文件夹下的全部文件夹文件. PRINTF() { ls $1 | while read line #一次读取每一行放到line变量中 do [ -d $1/$line ] && { DIR="$1/$line" echo $DIR } DIR1=`dirname $DIR` #求路径. A=`ls -F $DIR1 | grep / | grep "\<$line\>"` #推断line是不是一个文件

linux 文件夹-文件权限设置

只设置文件夹权限为755 文件权限为644find -type d -exec chmod 755 {} \;  find -type f -exec chmod 644 {} \;  或者  find -type d|xargs chmod 755  find -type f|xargs chmod 644 linux 文件夹-文件权限设置,布布扣,bubuko.com

python 遍历文件夹 文件

python 遍历文件夹 文件 import os import os.path rootdir = "d:\data" # 指明被遍历的文件夹 for parent,dirnames,filenames in os.walk(rootdir): #三个参数:分别返回1.父目录 2.所有文件夹名字(不含路径) 3.所有文件名字 for dirname in dirnames: #输出文件夹信息 print "parent is:" + parent print &q

python批量改动指定文件夹文件名称

这小样例仅仅要是说明用python怎么批量改动指定文件夹的文件名称: 记得要把脚本跟改动的文件放在同一个文件夹下 #encoding:utf-8 import os import sys files = os.listdir('D:\\1') #路径能够自己 for name in files: a = os.path.splitext(name) if a[1] == '.txt': #txt能够自己手动改动成你想改的文件名称 newname = a[0]+'.py' #.py也是能够改动 p

python 遍历文件夹文件代码

import os def tree(top): for path, names, fnames in os.walk(top): for fname in fnames: yield os.path.join(path, fname) for name in tree('C:\Users\XXX\Downloads\Test'): print name python 遍历文件夹文件代码