我如何在标签中显示硬盘上文件的实际大小?

58 浏览
0 Comments

我如何在标签中显示硬盘上文件的实际大小?

这个问题已经有答案

如何使用 .NET 获取一个人类可读的文件大小的字节缩写?

我正在使用这个方法:

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日
0
0 Comments

你只需要使用一些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();
}

0
0 Comments

编程的好处在于可以自动化重复性的任务。一种自动计算文件大小的解决方案可以是:

  • 找到文件大小
  • 重复执行,直到大小大于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

这种方法可以在精度方面进行优化,但对于一般用途应该是可以的。

0