如何在标签中显示硬盘上文件的实际大小?
本文关键字:文件 标签 硬盘 显示 | 更新日期: 2023-09-27 18:02:43
我使用这个方法:
public static long GetFileSizeOnDisk(string file)
{
FileInfo info = new FileInfo(file);
uint dummy, sectorsPerCluster, bytesPerSector;
int result = GetDiskFreeSpaceW(info.Directory.Root.FullName, out sectorsPerCluster, out bytesPerSector, out dummy, out dummy);
if (result == 0) throw new Win32Exception();
uint clusterSize = sectorsPerCluster * bytesPerSector;
uint hosize;
uint losize = GetCompressedFileSizeW(file, out hosize);
long size;
size = (long)hosize << 32 | losize;
return ((size + clusterSize - 1) / clusterSize) * clusterSize;
}
并像这样使用:
label10.Text = GetFileSizeOnDisk(previewFileName).ToString();
例如:5074944但是我想让它显示的是,如果它低,那么兆字节,那么显示为kb,如果高于兆字节,我的意思是,如果5074944是兆字节,那么显示为:5,074944 mb包括MB
或者如何知道显示/写入大小。
编程的好处是,重复的任务可以自动完成。自动计算尺寸的解决方案可以是:
- 查找文件大小
- 重复,直到size大于1024
- 将size除以1024
- store size position 循环
代码看起来像这样:
private String sizeFormatter(Int64 filesize)
{
var sizes = new List<String> { "B", "KB", "MB", "GB", "TB", "PB" };
var size = 0;
while (filesize > 1024)
{
filesize /= 1024;
size++;
}
return String.Format("{0}{1}", filesize, sizes[size]);
}
和用法:
var bigFile = new FileInfo("C:''oracle''OracleXE112_Win32.zip");
var smallFile = new FileInfo("C:''oracle''ScriptCreateUser.sql");
var verySmallFile = new FileInfo("C:''ScriptCreateTable.sql");
Console.WriteLine(sizeFormatter(bigFile.Length));
Console.WriteLine(sizeFormatter(smallFile.Length));
Console.WriteLine(sizeFormatter(verySmallFile.Length));
输出为:
312MB
12KB
363B
这个方法可以在精度方面进行优化,但对于一般使用来说,它应该是可以的。
你应该使用一些if语句:
long size = GetFileSizeOnDisk(previewFileName);
if(size > 1024 * 1024 * 1024)
{
label10.Text = (size / 1024 * 1024 * 1024F).ToString() + " Gb";
}
else if(size > 1024 * 1024)
{
label10.Text = (size / 1024 * 1024F).ToString() + " Mb";
}
else if(size > 1024)
{
label10.Text = (size / 1024F).ToString() + " Kb";
}
else
{
label10.Text = size.ToString();
}