首页 新闻 论坛 群组 Blog 文档 下载 读书 Tag 网摘 搜索 .NET Java 游戏 视频 人才 外包 培训 数据库 书店 程序员
中国软件网
欢迎您:游客 | 登录 注册 帮助
  • C# WinForm: 如 何 获 取 文 件 占 用 空 间 大 小 (不 是 实 际 大 小) 楼 主 在 线 [无满意答案结帖]
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    • yangjianpro_hotmail
    • 等级:
    • 可用分等级:
    • 总技术分:
    • 总技术分排名:
    • 揭贴率:
    发表于:2008-08-20 08:40:04 楼主
    C# WinForm:

      大家都知道由于Windows系统自带的基于内核的压缩功能,导致文件会有实际大小和站用空间大小的区别,
      您可以随便选个您电脑上的文件  右击->属性  就可以看到有大小和站用空间大小的区别;
      .NET可以处理文件大小(指实际大小)的方法,这个我也知道,
      那请问的是如何获取文件占用空间的大小呢(能获取其占用空间的字节数即可)???
      我也想尽了招  也查了很多资料  只知道这个占用大小应该是簇的整数倍,那究竟是个什么关系呢,有计算关系么? 有相关的API可以实现获取么?
      请大家各抒己见,谈谈思路或解决方法,助小弟一臂,谢谢!
    20  修改 删除 举报 引用 回复
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    • yangjianpro_hotmail
    • 等级:
    • 可用分等级:
    • 总技术分:
    • 总技术分排名:
    发表于:2008-08-20 08:51:581楼 得分:0
    被人遗忘的问题...
    修改 删除 举报 引用 回复
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    • CsToD
    • 等级:
    • 可用分等级:
    • 总技术分:
    • 总技术分排名:
    发表于:2008-08-20 09:02:182楼 得分:0
    FAT32簇的大小是8KB
    NTFS是4KB
    所需的空间是能够容纳文件所需的最少的簇

    比如文件大小是212KB
    在FAT32下占用的空间是214KB(212/8 = 26.5 ,即要占用27个簇,大小为27*8)
    在NTFS下占用212KB(212/4=53,占用53个簇,大小为53*4)
    修改 删除 举报 引用 回复
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    • gomoku
    • 等级:
    • 可用分等级:
    • 总技术分:
    • 总技术分排名:
    发表于:2008-08-20 09:43:233楼 得分:0
    1. If the file is a compressed file or a sparse file (use File.GetAttributes() to check), you can try the GetCompressedFileSize() API.


    2. Use GetDiskFreeSpace to get the cluster size
    C# code
    BOOL WINAPI GetDiskFreeSpace( __in LPCTSTR lpRootPathName, __out LPDWORD lpSectorsPerCluster, //<-- __out LPDWORD lpBytesPerSector, //<-- __out LPDWORD lpNumberOfFreeClusters, __out LPDWORD lpTotalNumberOfClusters ); DWORD ClusterSize = SectorsPerCluster * BytesPerSector;


    3. SizeOnDisk = ClusterSize * ((FileLength + ClusterSize - 1) / ClusterSize);
    修改 删除 举报 引用 回复
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    • MonkWang
    • 等级:
    • 可用分等级:
    • 总技术分:
    • 总技术分排名:
    发表于:2008-08-20 09:52:414楼 得分:0
    恩,二楼讲的有道理
    修改 删除 举报 引用 回复
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    • sleep0110
    • 等级:
    • 可用分等级:
    • 总技术分:
    • 总技术分排名:
    发表于:2008-08-20 10:00:405楼 得分:0
    引用 2 楼 CsToD 的回复:
    FAT32簇的大小是8KB
    NTFS是4KB
    所需的空间是能够容纳文件所需的最少的簇

    比如文件大小是212KB
    在FAT32下占用的空间是214KB(212/8 = 26.5 ,即要占用27个簇,大小为27*8)
    在NTFS下占用212KB(212/4=53,占用53个簇,大小为53*4)

    族来计算,也比较简单,不错
    修改 删除 举报 引用 回复
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    • LQknife
    • 等级:
    • 可用分等级:
    • 总技术分:
    • 总技术分排名:
    发表于:2008-08-20 10:07:496楼 得分:0
    晓习来了
    修改 删除 举报 引用 回复
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    • Player26
    • 等级:
    • 可用分等级:
    • 总技术分:
    • 总技术分排名:
    发表于:2008-08-20 10:11:097楼 得分:0
    引用 2 楼 CsToD 的回复:
    FAT32簇的大小是8KB
    NTFS是4KB
    所需的空间是能够容纳文件所需的最少的簇

    比如文件大小是212KB
    在FAT32下占用的空间是214KB(212/8 = 26.5 ,即要占用27个簇,大小为27*8)
    在NTFS下占用212KB(212/4=53,占用53个簇,大小为53*4)


    就是这个样子  但是多个文件的话 每个文件都要重新计算 然后加和 
    修改 删除 举报 引用 回复
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    • jingang123gz
    • 等级:
    • 可用分等级:
    • 总技术分:
    • 总技术分排名:
    发表于:2008-08-20 17:03:078楼 得分:0
    using System;
    using System.Collections.Generic;
    using System.ComponentModel;
    using System.Data;
    using System.Drawing;
    using System.Text;
    using System.Windows.Forms;

    namespace HardDiskFileType
    {
        public partial class Form1 : Form
        {
            public Form1()
            {
                InitializeComponent();
            }

            private void Form1_Load(object sender, EventArgs e)
            {
                System.IO.DriveInfo[] drive = System.IO.DriveInfo.GetDrives();
                for (int i = 0; i < drive.Length; i++)
                {
                    comboBox1.Items.Add(drive[i].Name);
                 
                }
           
            }

            private void comboBox1_SelectedValueChanged(object sender, EventArgs e)
            {
                System.IO.DriveInfo[] drive = System.IO.DriveInfo.GetDrives();
                for (int i = 0; i < drive.Length; i++)
                {
                    if (comboBox1.SelectedItem.ToString() == drive[i].Name)
                    {
                        //获取文件系统的名称NTFS或FAT32
                        textBox1.Text = drive[i].DriveFormat;
                        //获取磁盘的空间的大小
                        textBox2.Text = drive[i].TotalSize.ToString();
                        //磁盘的类型
                        textBox3.Text = drive[i].DriveType.ToString();
                        //
                        textBox4.Text = drive[i].AvailableFreeSpace.ToString();
                        //磁盘名称
                        textBox5.Text = drive[i].VolumeLabel;
                        //磁盘的根目录
                        textBox6.Text = drive[i].RootDirectory.ToString();
                        //磁盘空间总量
                        textBox7.Text = drive[i].TotalFreeSpace.ToString();

                    }
                }
            }

            private void textBox1_TextChanged(object sender, EventArgs e)
            {

            }

           
        }
    }
    修改 删除 举报 引用 回复
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    • wdgphc
    • 等级:
    • 可用分等级:
    • 总技术分:
    • 总技术分排名:
    发表于:2008-08-20 17:12:049楼 得分:0
    引用 2 楼 CsToD 的回复:
    FAT32簇的大小是8KB
    NTFS是4KB
    所需的空间是能够容纳文件所需的最少的簇

    比如文件大小是212KB
    在FAT32下占用的空间是214KB(212/8 = 26.5 ,即要占用27个簇,大小为27*8)
    在NTFS下占用212KB(212/4=53,占用53个簇,大小为53*4)


    99%正确,但是NTFS的簇默认是4Kb,但是格式化的时候你可以自己选择改变,从512到64K都行.相应的所需空间也不同,但计算方法2楼说的对.
    修改 删除 举报 引用 回复
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    • yangjianpro_hotmail
    • 等级:
    • 可用分等级:
    • 总技术分:
    • 总技术分排名:
    发表于:2008-08-21 13:24:4710楼 得分:0
    谢谢楼上几位热心的朋友,二楼的方法真的不错,但9楼的朋友也说的对,格式化的时候是可以从512-4096自选的,严谨起见,那在程序中就不能特定的用4KB或8KB来计算了  最好先能判断出用户机上是选择的512-4096的那一种的比较好,再次谢谢各位,可以继续考虑完善,三日后再加点分上去,上次真的没什么分了。谢谢。
    修改 删除 举报 引用 回复
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    • haha0369
    • 等级:
    • 可用分等级:
    • 总技术分:
    • 总技术分排名:
    发表于:2008-08-21 14:13:4411楼 得分:0
    2楼的正确,9楼的完整
    修改 删除 举报 引用 回复
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    • yangjianpro_hotmail
    • 等级:
    • 可用分等级:
    • 总技术分:
    • 总技术分排名:
    发表于:2008-08-21 17:24:1912楼 得分:0
    追求更完整  那就是将2楼与9楼的综合考虑
    现在不知道怎么解决9楼遗留的问题:
    格式化的时候是可以从512-4096自选的
    能否先判断出用户机上是选择的512-4096的那一种格式化的方式,再才能决定是用4或8或几带入计算呀?
    修改 删除 举报 引用 回复
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    • GhostAdai
    • 等级:
    • 可用分等级:
    • 总技术分:
    • 总技术分排名:
    发表于:2008-08-22 14:59:2313楼 得分:0
    用GetDiskFreeSpaceEx这个函数试试看能不能算出簇大小来。
    修改 删除 举报 引用 回复

    网站简介广告服务网站地图帮助联系方式诚聘英才English 问题报告
    北京创新乐知广告有限公司 版权所有 京 ICP 证 070598 号
    世纪乐知(北京)网络技术有限公司 提供技术支持
    Copyright © 2000-2008, CSDN.NET, All Rights Reserved