Computer >> Hướng Dẫn Máy Tính >  >> Lập Trình >> C#

Lấy kích thước file trong C#

Sử dụng class System.IO.FileInfo để lấy thông tin file, trong đó property Length trả về kích thước tính bằng byte (kiểu long).

Cách cơ bản


using System.IO;

string path = @"C:\Data\file.txt";
long sizeInBytes = new FileInfo(path).Length;
Console.WriteLine($"Size: {sizeInBytes} bytes");

Lấy kích thước nhiều file trong thư mục


string dirPath = @"C:\Data";
DirectoryInfo dir = new DirectoryInfo(dirPath);
FileInfo[] files = dir.GetFiles();

foreach (FileInfo file in files)
{
    Console.WriteLine($"{file.Name}: {file.Length} bytes");
}

Format kích thước dễ đọc (KB, MB, GB)


static string FormatFileSize(long bytes)
{
    if (bytes < 0) return "0 B";
    string[] units = { "B", "KB", "MB", "GB", "TB" };
    int i = 0;
    double size = bytes;
    while (size >= 1024 && i < units.Length - 1)
    {
        size /= 1024;
        i++;
    }
    return $"{size:0.##} {units[i]}";
}

// Usage
foreach (FileInfo file in files)
    Console.WriteLine($"{file.Name}: {FormatFileSize(file.Length)}");

Kết quả mẫu


config.json: 1.23 KB
image.png: 2.5 MB
video.mp4: 1.2 GB
empty.txt: 0 B

Lưu ý quan trọng

  • FileInfo.Length trả về long (hỗ trợ file > 4GB). int chỉ đủ 2GB.
  • File không tồn tại: FileInfo không ném exception, nhưng Length sẽ ném FileNotFoundException khi truy cập. Kiểm tra file.Exists trước.
  • Directory.GetFiles vs DirectoryInfo.GetFiles: DirectoryInfo trả về FileInfo[] (có Length), Directory.GetFiles trả về string[] (cần new FileInfo).
  • Dùng Directory.EnumerateFiles / DirectoryInfo.EnumerateFiles cho thư mục lớn (lazy, tiết kiệm RAM).

Ví dụ an toàn (Kiểm tra tồn tại)


string path = @"C:\Data\maybe_missing.txt";
FileInfo fi = new FileInfo(path);

if (fi.Exists)
{
    Console.WriteLine($"{fi.Name}: {FormatFileSize(fi.Length)}");
}
else
{
    Console.WriteLine("File not found");
}

.NET 6+: FileInfo.Length là long, có thể dùng pattern matching


// Switch expression cho size category
string GetSizeCategory(FileInfo fi) => fi.Length switch
{
    < 1024 => "Tiny (<1KB)",
    < 1024 * 1024 => "Small (<1MB)",
    < 100 * 1024 * 1024 => "Medium (<100MB)",
    _ => "Large"
};