CodeGym /Các khóa học /C# SELF /Khái niệm về file, hệ thống file và đường dẫn

Khái niệm về file, hệ thống file và đường dẫn

C# SELF
Mức độ , Bài học
Có sẵn

1. Giới thiệu

File — chỉ đơn giản là một khối dữ liệu được lưu trữ vật lý trên một thiết bị lưu trữ nào đó: ổ cứng, SSD, USB, thậm chí là đĩa mềm (gửi lời chào đến ông nội của bạn nhé!). Đối với người dùng, file là thứ có thể mở, đọc, sửa và lưu lại.

Trong lập trình, file là một chuỗi byte có tên và vị trí nhất định, còn với bạn - lập trình viên - nó là một object có tên, đường dẫn (giống như địa chỉ), kích thước, ngày tạo, v.v. Quan trọng nhất: file là nơi lưu trữ dữ liệu bền vững (persist). Mọi thứ xảy ra trong RAM sau khi chạy chương trình thường sẽ biến mất khi chương trình kết thúc, còn file thì vẫn còn đó.

Hệ thống file là gì?

Hệ thống file — là cách lưu trữ và tổ chức file trên ổ đĩa. Nó trả lời các câu hỏi: tìm file ở đâu, như thế nào, ai có quyền truy cập, thư mục (directory) được tổ chức ra sao, làm sao tìm tên file và nội dung của nó.

Hãy tưởng tượng một cái tủ khổng lồ với nhiều ngăn kéo. Trong mỗi ngăn kéo có thể có thư mục, trong mỗi thư mục có tài liệu (file). Để tìm ghi chú về C#, bạn phải mở tủ, tìm đúng ngăn, lấy thư mục ra và trong đó là tờ giấy bạn cần. Hệ thống file cũng tổ chức thông tin như vậy.

Các hệ thống file phổ biến

  • NTFS — hệ thống file "gốc" của Windows.
  • FAT32, exFAT — cho USB, thẻ SD, ổ cứng ngoài.
  • EXT4 — phổ biến trên Linux.
  • APFS, HFS+ — macOS.

Với lập trình viên C#, thường thì bạn không cần quan tâm lắm: .NET đã ẩn hết chi tiết, bạn chỉ làm việc với khái niệm "file/thư mục". Nhưng đôi khi biết một chút cũng có ích. Ví dụ, trong NTFS bạn có thể dùng dấu cách và nhiều ký tự đặc biệt trong tên file, còn FAT32 thì không.

2. Thư mục (directory) hoạt động như thế nào

Thư mục (hay folder) — là một loại file đặc biệt chứa danh sách các file khác và/hoặc thư mục con. Cây thư mục (file hierarchy) là đường đi quen thuộc từ gốc đến file: ví dụ, C:\Users\Иван\Documents\MyFile.txt.

  • Gốc — là điểm bắt đầu của ổ đĩa (C:\).
  • Bên trong là các thư mục con, trong đó có file hoặc thư mục khác.

Đây là hình minh họa đơn giản:


C:\
 └── Users\
     └── Иван\
         ├── Documents\
         │    └── MyFile.txt
         └── Pictures\
              └── Cat.jpg

3. Đường dẫn file (file path) là gì?

Đường dẫn file — là "địa chỉ" của file trong cây thư mục. Nhờ nó bạn có thể tìm chính xác file hoặc thư mục cần thiết.

Đường dẫn tuyệt đối và tương đối

  • Đường dẫn tuyệt đối: bắt đầu từ gốc của hệ thống file.
    Windows: C:\Users\Иван\Documents\MyFile.txt
    Linux/macOS: /home/ivan/Documents/MyFile.txt
  • Đường dẫn tương đối: bắt đầu từ vị trí hiện tại (thư mục hiện tại).
    Ví dụ, nếu chương trình của bạn chạy từ thư mục C:\Users\Иван, thì đường dẫn tương đối Documents\MyFile.txt cũng sẽ dẫn đến file đó.

Thư mục hiện tại — là khái niệm đặc biệt: nó là "điểm xuất phát" cho mọi đường dẫn tương đối. Khi chạy chương trình, thường thì đó là thư mục chứa file .exe hoặc nơi bạn mở terminal.

Sơ đồ: Đường dẫn tuyệt đối và tương đối


Đường dẫn tuyệt đối                                Đường dẫn tương đối

C:\Projects\MyApp\logs\output.txt              logs\output.txt
└─ Gốc ổ đĩa (C:)                              └─ Tính từ MyApp đang chạy

Ký tự phân tách trong đường dẫn: \/

Trên Windows dùng dấu gạch ngược (\), còn trên Linux/macOS thường là dấu gạch chéo (/).

.NET hiện đại hỗ trợ cả hai kiểu, nhưng đừng trộn lẫn trong cùng một project nhé. Khi tạo đường dẫn, luôn dùng API chuyên dụng (application programming interface), đừng tự nối chuỗi bằng tay.

4. Chương trình nhìn thấy file như thế nào

Trong .NET có rất nhiều công cụ để làm việc với file. Những cái chính:

  • System.IO.File: các phương thức static để đọc, ghi, xóa, kiểm tra file có tồn tại không, v.v.
  • System.IO.Directory: các phương thức tương tự cho thư mục.
  • System.IO.FileInfoSystem.IO.DirectoryInfo: object wrapper để truy cập metadata của file/thư mục.
  • System.IO.Path: class hỗ trợ làm việc với đường dẫn (nối đường dẫn, lấy extension, tên file, v.v.).

Một vài ví dụ nhỏ

Kiểm tra file có tồn tại không


using System.IO;

if (File.Exists("data.txt"))
{
    Console.WriteLine("File đã tìm thấy!");
}
else
{
    Console.WriteLine("Không tìm thấy file!");
}

Lấy kích thước file


var info = new FileInfo("data.txt");
Console.WriteLine($"Kích thước file: {info.Length} byte");

Chúng ta sẽ phân tích kỹ các ví dụ này ở những bài sau. Bây giờ thì cứ xem cho vui thôi nhé :).

5. Một số lưu ý hữu ích

Metadata của file: tên, extension, kích thước, ngày tháng, v.v.

Khi làm việc với file, bạn không chỉ quan tâm đến nội dung — còn có "hộ chiếu" của file nữa:

  • Tên — cái tên mà người dùng nhìn thấy.
  • Extension.txt, .jpg, .exe, .cs v.v.: đôi khi giúp đoán bên trong là gì.
  • Kích thước — số byte.
  • Ngày tạo/thay đổi — biết được file xuất hiện hoặc bị sửa lần cuối khi nào.
  • Thuộc tính — ví dụ: chỉ đọc, ẩn, hệ thống.

Trong .NET, các class FileInfo, DirectoryInfo rất tiện để làm việc với mấy cái này (sẽ học ở bài sau).

Extension và định dạng file

Extension — chỉ là phần sau dấu chấm trong tên file. Ví dụ, document.txt có extension là txt. Hệ điều hành dùng extension để biết nên mở file bằng gì (ví dụ, .jpg — chương trình xem ảnh, .xls — Excel, v.v.).

Nhưng với lập trình viên, extension chỉ là gợi ý thôi. Định dạng file thực sự chỉ được xác định bởi nội dung bên trong. Bạn hoàn toàn có thể mở file MyCat.jpg như file text — và sẽ thấy toàn ký tự "lạ hoắc" (chả phải hình ảnh gì cả). Nên nhớ: extension không phải là bảo đảm, chỉ là quy ước thôi.

Đọc và ghi file hoạt động như thế nào: khái niệm cơ bản

File là một chuỗi byte. Làm việc với file trong C# thường gồm:

  • Mở file để đọc hoặc ghi (hoặc cả hai).
  • Đọc dữ liệu vào RAM.
  • Ghi dữ liệu mới ra ổ đĩa.
  • Đóng file — rất quan trọng, nếu không bạn sẽ giữ tài nguyên hệ thống (người khác không xóa được file khi bạn còn mở nó).

API hiện đại trong .NET lo hết cho bạn: ví dụ, class File có thể mở, đọc và tự động đóng file luôn. Nhưng khi làm việc với stream (Stream) và file lớn thì phải cẩn thận (sẽ nói kỹ ở bài sau).

Lưu ý về đa nền tảng

Gần như toàn bộ C# hiện đại chạy trên Windows, Linux và macOS gần như giống nhau. Nhưng vẫn có một số khác biệt. Phổ biến nhất là ký tự phân tách (\ vs /), giới hạn độ dài tên file và các ký tự cấm.

Đó là lý do API như Path.Combine và các method trong System.IO.Path là bạn thân của bạn. Chúng sẽ "nối" đường dẫn đúng trên mọi hệ điều hành. Đừng bao giờ viết như này:


var filePath = "C:\\Users\\Ivan\\data.txt"; // Chỉ dùng cho Windows!

Tốt hơn là:


var filePath = Path.Combine("Users", "Ivan", "data.txt");

Làm sao biết thư mục làm việc hiện tại?

Đôi khi bạn cần biết file của mình sẽ được lưu ở đâu. Có một class đặc biệt cho việc này:


string currentDir = Environment.CurrentDirectory;
Console.WriteLine($"Thư mục hiện tại: {currentDir}");

À mà này, nếu muốn cho người dùng chọn đường dẫn, hãy dùng dialog chọn file/thư mục hoặc truyền qua command line argument nhé.

2
Nhiệm vụ
C# SELF, mức độ, bài học
Đã khóa
Lấy thông tin về tệp tin
Lấy thông tin về tệp tin
Bình luận
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION