在C#开发中,获取文件大小是一个常见的需求,比如做文件上传限制、存储空间统计等功能时都需要用到。FileInfo类是System.IO命名空间下专门用于封装文件相关属性的类,它的Length属性可以直接返回文件的字节数,是实现文件大小获取最便捷的方式。

FileInfo类的基本使用
使用FileInfo获取文件大小的核心步骤很简单,首先需要创建FileInfo实例,传入目标文件的完整路径,然后直接访问实例的Length属性即可。Length属性的返回值是long类型,单位是字节。
下面是一个最基础的获取单个文件大小的示例代码:
using System;
using System.IO;
namespace FileSizeDemo
{
class Program
{
static void Main(string[] args)
{
// 目标文件的完整路径
string filePath = @"D:testexample.txt";
// 创建FileInfo实例
FileInfo fileInfo = new FileInfo(filePath);
// 判断文件是否存在,避免异常
if (fileInfo.Exists)
{
// 获取文件大小,单位字节
long fileSize = fileInfo.Length;
Console.WriteLine($"文件大小:{fileSize} 字节");
}
else
{
Console.WriteLine("目标文件不存在");
}
}
}
}
字节单位转换
直接使用字节数展示文件大小不够直观,通常需要转换成KB、MB、GB等常用单位。转换规则是1KB=1024字节,1MB=1024KB,1GB=1024MB,我们可以通过循环判断的方式实现自动转换。
单位转换的示例代码如下:
using System;
namespace FileSizeDemo
{
class FileSizeHelper
{
/// <summary>
/// 将字节数转换为可读的文件大小字符串
/// </summary>
/// <param name="bytes">字节数</param>
/// <returns>转换后的字符串</returns>
public static string FormatFileSize(long bytes)
{
string[] units = { "B", "KB", "MB", "GB", "TB" };
int unitIndex = 0;
double size = bytes;
// 循环除以1024,直到数值小于1024或者达到最大单位
while (size >= 1024 && unitIndex < units.Length - 1)
{
size /= 1024;
unitIndex++;
}
// 保留两位小数点
return $"{size:F2} {units[unitIndex]}";
}
}
}
结合之前的FileInfo代码,调用这个转换方法就可以得到直观的文件大小展示:
using System;
using System.IO;
namespace FileSizeDemo
{
class Program
{
static void Main(string[] args)
{
string filePath = @"D:testexample.txt";
FileInfo fileInfo = new FileInfo(filePath);
if (fileInfo.Exists)
{
long fileSize = fileInfo.Length;
string formattedSize = FileSizeHelper.FormatFileSize(fileSize);
Console.WriteLine($"文件大小:{formattedSize}");
}
}
}
}
批量获取文件大小
如果需要获取某个目录下所有文件的大小,可以结合DirectoryInfo类的GetFiles方法,先获取目录下的所有文件,再遍历每个文件创建FileInfo实例获取大小。
批量获取文件大小的示例代码如下:
using System;
using System.IO;
namespace FileSizeDemo
{
class Program
{
static void Main(string[] args)
{
// 目标目录路径
string directoryPath = @"D:test";
DirectoryInfo directoryInfo = new DirectoryInfo(directoryPath);
if (directoryInfo.Exists)
{
// 获取目录下所有文件,不包含子目录
FileInfo[] files = directoryInfo.GetFiles();
long totalSize = 0;
foreach (FileInfo file in files)
{
long fileSize = file.Length;
totalSize += fileSize;
string formattedSize = FileSizeHelper.FormatFileSize(fileSize);
Console.WriteLine($"文件:{file.Name},大小:{formattedSize}");
}
string totalFormatted = FileSizeHelper.FormatFileSize(totalSize);
Console.WriteLine($"目录下所有文件总大小:{totalFormatted}");
}
else
{
Console.WriteLine("目标目录不存在");
}
}
}
}
注意事项
- 使用FileInfo之前一定要先判断文件是否存在,否则访问Length属性会抛出FileNotFoundException异常。
- 如果文件正在被其他进程占用,可能无法正常读取文件信息,需要做好异常处理。
- Length属性返回的是文件的真实大小,不包含文件系统的簇大小开销,如果需要获取文件占用的磁盘空间,需要结合系统API实现。
- FileInfo实例创建后,如果文件被修改,需要重新创建实例才能获取最新的文件大小,因为FileInfo的属性是创建时缓存的。