C# WinForm:   大家都知道由于Windows系统自带的基于内核的压缩功能,导致文件会有实际大小和站用空间大小的区别,
   您可以随便选个您电脑上的文件  右击->属性  就可以看到有大小和站用空间大小的区别;
   .NET可以处理文件大小(指实际大小)的方法,这个我也知道,
   那请问的是如何获取文件占用空间的大小呢(能获取其占用空间的字节数即可)???
   我也想尽了招  也查了很多资料  只知道这个占用大小应该是簇的整数倍,那究竟是个什么关系呢,有计算关系么? 有相关的API可以实现获取么?
   请大家各抒己见,谈谈思路或解决方法,助小弟一臂,谢谢!

解决方案 »

  1.   

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

  2.   

    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 sizeBOOL 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);
      

  3.   

    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)
            {        }        
        }
    }
      

  4.   


    99%正确,但是NTFS的簇默认是4Kb,但是格式化的时候你可以自己选择改变,从512到64K都行.相应的所需空间也不同,但计算方法2楼说的对.
      

  5.   

    谢谢楼上几位热心的朋友,二楼的方法真的不错,但9楼的朋友也说的对,格式化的时候是可以从512-4096自选的,严谨起见,那在程序中就不能特定的用4KB或8KB来计算了   最好先能判断出用户机上是选择的512-4096的那一种的比较好,再次谢谢各位,可以继续考虑完善,三日后再加点分上去,上次真的没什么分了。谢谢。
      

  6.   

    用GetDiskFreeSpaceEx这个函数试试看能不能算出簇大小来。
      

  7.   

    那不叫压缩
    你在格式化硬盘的时候有个选项,一般选4096的多一些,就是说无论一个文件多小,最少要占这么大的地
    主要是为了防止硬盘碎片的,不然碎片太小的话非常麻烦
    所以你一个1KB的文件也是占4KB的大小,这不是压缩,仅仅是硬盘 + OS的应用而已