C# WinForm: 大家都知道由于Windows系统自带的基于内核的压缩功能,导致文件会有实际大小和站用空间大小的区别,
您可以随便选个您电脑上的文件 右击->属性 就可以看到有大小和站用空间大小的区别;
.NET可以处理文件大小(指实际大小)的方法,这个我也知道,
那请问的是如何获取文件占用空间的大小呢(能获取其占用空间的字节数即可)???
我也想尽了招 也查了很多资料 只知道这个占用大小应该是簇的整数倍,那究竟是个什么关系呢,有计算关系么? 有相关的API可以实现获取么?
请大家各抒己见,谈谈思路或解决方法,助小弟一臂,谢谢!
您可以随便选个您电脑上的文件 右击->属性 就可以看到有大小和站用空间大小的区别;
.NET可以处理文件大小(指实际大小)的方法,这个我也知道,
那请问的是如何获取文件占用空间的大小呢(能获取其占用空间的字节数即可)???
我也想尽了招 也查了很多资料 只知道这个占用大小应该是簇的整数倍,那究竟是个什么关系呢,有计算关系么? 有相关的API可以实现获取么?
请大家各抒己见,谈谈思路或解决方法,助小弟一臂,谢谢!
解决方案 »
- Socket通讯问题
- 小妹求救!求救!问一个超难的TabControl去边框的问题!
- 求帮助!!不是理论,而是方法!
- 关于进程,uac的问题
- 寻找梅花雪 ,寻找梅花雪 ,寻找梅花雪 ,寻找梅花雪
- 高分求GDI 的绘图代码
- 神舟的小本能装VS2005?
- 如何作一个窗体,即可以改变大小,又不要标题栏,但在任务栏中还要有窗体名称,在线等!!!
- 求助~!关于在C#中,有一个服务端和客服端,如何使客服端在收到收到服务端传来的数据后再进行下面的程序~~!
- datagridview 中某列为自定义的combobox+treeview,怎样更新数据库
- C#语言来写读卡程序,在手持上跑的14443b卡,怎么来实现卡的读写??(有厂家给的sdk,函数是有了)
- 能否在dataGridView中对某个指定的单元格单独设置样式,比如背景颜色之类。
NTFS是4KB
所需的空间是能够容纳文件所需的最少的簇比如文件大小是212KB
在FAT32下占用的空间是214KB(212/8 = 26.5 ,即要占用27个簇,大小为27*8)
在NTFS下占用212KB(212/4=53,占用53个簇,大小为53*4)
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);
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)
{ }
}
}
99%正确,但是NTFS的簇默认是4Kb,但是格式化的时候你可以自己选择改变,从512到64K都行.相应的所需空间也不同,但计算方法2楼说的对.
你在格式化硬盘的时候有个选项,一般选4096的多一些,就是说无论一个文件多小,最少要占这么大的地
主要是为了防止硬盘碎片的,不然碎片太小的话非常麻烦
所以你一个1KB的文件也是占4KB的大小,这不是压缩,仅仅是硬盘 + OS的应用而已