C# WinForm: 如 何 获 取 文 件 占 用 空 间 大 小 (不 是 实 际 大 小) 楼 主 在 线

KaKaKaKa 2008-08-20 08:40:04
C# WinForm:

大家都知道由于Windows系统自带的基于内核的压缩功能,导致文件会有实际大小和站用空间大小的区别,
您可以随便选个您电脑上的文件 右击->属性 就可以看到有大小和站用空间大小的区别;
.NET可以处理文件大小(指实际大小)的方法,这个我也知道,
那请问的是如何获取文件占用空间的大小呢(能获取其占用空间的字节数即可)???
我也想尽了招 也查了很多资料 只知道这个占用大小应该是簇的整数倍,那究竟是个什么关系呢,有计算关系么? 有相关的API可以实现获取么?
请大家各抒己见,谈谈思路或解决方法,助小弟一臂,谢谢!
...全文
1296 18 打赏 收藏 转发到动态 举报
写回复
用AI写文章
18 条回复
切换为时间正序
请发表友善的回复…
发表回复
那时很爱倪 2011-08-30
  • 打赏
  • 举报
回复
[Quote=引用 3 楼 gomoku 的回复:]
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
……
[/Quote]

被无视的答案
lincal_w 2010-12-28
  • 打赏
  • 举报
回复
那不叫压缩
你在格式化硬盘的时候有个选项,一般选4096的多一些,就是说无论一个文件多小,最少要占这么大的地
主要是为了防止硬盘碎片的,不然碎片太小的话非常麻烦
所以你一个1KB的文件也是占4KB的大小,这不是压缩,仅仅是硬盘 + OS的应用而已
zhangcui0311 2010-09-27
  • 打赏
  • 举报
回复
谢谢8楼!正好我需要这些代码!
jingzhongrong 2010-03-29
  • 打赏
  • 举报
回复
#3楼的回答给无视了?答案就在那里!!
天地英豪 2009-03-22
  • 打赏
  • 举报
回复
关注中...
GhostAdai 2008-08-22
  • 打赏
  • 举报
回复
用GetDiskFreeSpaceEx这个函数试试看能不能算出簇大小来。
KaKaKaKa 2008-08-21
  • 打赏
  • 举报
回复
追求更完整 那就是将2楼与9楼的综合考虑
现在不知道怎么解决9楼遗留的问题:
格式化的时候是可以从512-4096自选的
能否先判断出用户机上是选择的512-4096的那一种格式化的方式,再才能决定是用4或8或几带入计算呀?
haha0369 2008-08-21
  • 打赏
  • 举报
回复
2楼的正确,9楼的完整
KaKaKaKa 2008-08-21
  • 打赏
  • 举报
回复
谢谢楼上几位热心的朋友,二楼的方法真的不错,但9楼的朋友也说的对,格式化的时候是可以从512-4096自选的,严谨起见,那在程序中就不能特定的用4KB或8KB来计算了 最好先能判断出用户机上是选择的512-4096的那一种的比较好,再次谢谢各位,可以继续考虑完善,三日后再加点分上去,上次真的没什么分了。谢谢。
萱哥老了 2008-08-20
  • 打赏
  • 举报
回复
[Quote=引用 2 楼 CsToD 的回复:]
FAT32簇的大小是8KB
NTFS是4KB
所需的空间是能够容纳文件所需的最少的簇

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

就是这个样子 但是多个文件的话 每个文件都要重新计算 然后加和
LQknife 2008-08-20
  • 打赏
  • 举报
回复
晓习来了
睡神在睡觉 2008-08-20
  • 打赏
  • 举报
回复
[Quote=引用 2 楼 CsToD 的回复:]
FAT32簇的大小是8KB
NTFS是4KB
所需的空间是能够容纳文件所需的最少的簇

比如文件大小是212KB
在FAT32下占用的空间是214KB(212/8 = 26.5 ,即要占用27个簇,大小为27*8)
在NTFS下占用212KB(212/4=53,占用53个簇,大小为53*4)
[/Quote]
族来计算,也比较简单,不错
MonkWang 2008-08-20
  • 打赏
  • 举报
回复
恩,二楼讲的有道理
gomoku 2008-08-20
  • 打赏
  • 举报
回复
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

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);
CsToD 2008-08-20
  • 打赏
  • 举报
回复
FAT32簇的大小是8KB
NTFS是4KB
所需的空间是能够容纳文件所需的最少的簇

比如文件大小是212KB
在FAT32下占用的空间是214KB(212/8 = 26.5 ,即要占用27个簇,大小为27*8)
在NTFS下占用212KB(212/4=53,占用53个簇,大小为53*4)
KaKaKaKa 2008-08-20
  • 打赏
  • 举报
回复
被人遗忘的问题...
wdgphc 2008-08-20
  • 打赏
  • 举报
回复
[Quote=引用 2 楼 CsToD 的回复:]
FAT32簇的大小是8KB
NTFS是4KB
所需的空间是能够容纳文件所需的最少的簇

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

99%正确,但是NTFS的簇默认是4Kb,但是格式化的时候你可以自己选择改变,从512到64K都行.相应的所需空间也不同,但计算方法2楼说的对.
jingang123gz 2008-08-20
  • 打赏
  • 举报
回复
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)
{

}


}
}

110,536

社区成员

发帖
与我相关
我的任务
社区描述
.NET技术 C#
社区管理员
  • C#
  • Web++
  • by_封爱
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

让您成为最强悍的C#开发者

试试用AI创作助手写篇文章吧