我如何在标签中显示硬盘上文件的实际大小?
我如何在标签中显示硬盘上文件的实际大小?
这个问题已经有答案:
我正在使用这个方法:
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 显示;如果高于兆字节,则以 MB 或 GB 显示,例如如果 5074944 是兆字节,则显示它为:5,074944 MB,包括 MB
或者它如何显示/编写大小。
admin 更改状态以发布 2023年5月21日
你只需要使用一些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(); }
编程的好处在于可以自动化重复性的任务。一种自动计算文件大小的解决方案可以是:
- 找到文件大小
- 重复执行,直到大小大于1024
- 将大小除以1024
- 存储大小位置
- 循环
代码可能如下所示:
private String sizeFormatter(Int64 filesize) { var sizes = new List{ "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
这种方法可以在精度方面进行优化,但对于一般用途应该是可以的。