在C#中获取文件大小有多种方法,以下是几种常用的方式:
1. 使用 FileInfo 类(最常用)
csharp
using System;
using System.IO;
class Program
{
static void Main()
{
string filePath = @"C:\example\file.txt";
// 方法1:使用FileInfo
FileInfo fileInfo = new FileInfo(filePath);
if (fileInfo.Exists)
{
// 获取文件大小(字节)
long fileSizeInBytes = fileInfo.Length;
Console.WriteLine($"文件大小(字节): {fileSizeInBytes} B");
// 转换为更友好的格式
Console.WriteLine($"文件大小(KB): {fileSizeInBytes / 1024.0:F2} KB");
Console.WriteLine($"文件大小(MB): {fileSizeInBytes / (1024.0 * 1024):F2} MB");
}
else
{
Console.WriteLine("文件不存在!");
}
}
}
2. 使用 File 静态类
csharp
using System;
using System.IO;
class Program
{
static void Main()
{
string filePath = @"C:\example\file.txt";
if (File.Exists(filePath))
{
FileInfo fileInfo = new FileInfo(filePath);
long fileSize = fileInfo.Length;
Console.WriteLine($"文件大小: {fileSize} 字节");
}
}
}
3. 使用 FileStream 获取文件大小
csharp
using System;
using System.IO;
class Program
{
static void Main()
{
string filePath = @"C:\example\file.txt";
try
{
using (FileStream fs = new FileStream(filePath, FileMode.Open, FileAccess.Read))
{
long fileSize = fs.Length;
Console.WriteLine($"文件大小: {fileSize} 字节");
}
}
catch (FileNotFoundException)
{
Console.WriteLine("文件不存在!");
}
}
}
4. 完整的工具类示例
csharp
using System;
using System.IO;
public class FileSizeHelper
{
/// <summary>
/// 获取文件大小(字节)
/// </summary>
public static long GetFileSizeInBytes(string filePath)
{
if (!File.Exists(filePath))
throw new FileNotFoundException($"文件不存在: {filePath}");
return new FileInfo(filePath).Length;
}
/// <summary>
/// 获取格式化后的文件大小字符串
/// </summary>
public static string GetFormattedFileSize(string filePath)
{
long bytes = GetFileSizeInBytes(filePath);
return FormatFileSize(bytes);
}
/// <summary>
/// 格式化文件大小
/// </summary>
public static string FormatFileSize(long bytes)
{
string[] sizes = { "B", "KB", "MB", "GB", "TB" };
int order = 0;
double size = bytes;
while (size >= 1024 && order < sizes.Length - 1)
{
order++;
size = size / 1024;
}
return $"{size:0.##} {sizes[order]}";
}
}
// 使用示例
class Program
{
static void Main()
{
string filePath = @"C:\example\file.txt";
try
{
long sizeInBytes = FileSizeHelper.GetFileSizeInBytes(filePath);
string formattedSize = FileSizeHelper.FormatFileSize(sizeInBytes);
Console.WriteLine($"文件大小(字节): {sizeInBytes}");
Console.WriteLine($"格式化后: {formattedSize}");
// 直接获取格式化大小
Console.WriteLine($"文件大小: {FileSizeHelper.GetFormattedFileSize(filePath)}");
}
catch (Exception ex)
{
Console.WriteLine($"错误: {ex.Message}");
}
}
}
5. 异步获取文件大小
csharp
using System;
using System.IO;
using System.Threading.Tasks;
public class AsyncFileSizeHelper
{
public static async Task<long> GetFileSizeAsync(string filePath)
{
return await Task.Run(() =>
{
if (!File.Exists(filePath))
throw new FileNotFoundException($"文件不存在: {filePath}");
return new FileInfo(filePath).Length;
});
}
}
// 使用示例
class Program
{
static async Task Main()
{
string filePath = @"C:\example\file.txt";
try
{
long fileSize = await AsyncFileSizeHelper.GetFileSizeAsync(filePath);
Console.WriteLine($"文件大小: {FileSizeHelper.FormatFileSize(fileSize)}");
}
catch (Exception ex)
{
Console.WriteLine($"错误: {ex.Message}");
}
}
}
注意事项
- 文件存在性检查:在获取文件大小前,应先检查文件是否存在
- 权限问题:确保程序有读取文件的权限
- 大文件处理 :对于非常大的文件(超过2GB),确保使用
long类型 - 路径格式:注意文件路径中的特殊字符和路径分隔符
- 异常处理:建议使用try-catch处理可能的异常
性能建议
- 对于频繁获取文件大小的场景,建议使用
FileInfo并缓存实例 - 异步方法适合在UI应用程序中使用,避免界面卡顿
- 对于网络文件,需要考虑网络延迟和超时设置
选择哪种方法取决于具体需求。FileInfo是最常用且性能较好的方法。