CodeGym /Các khóa học /C# SELF /Kiểm tra sự tồn tại của tệp/thư mục

Kiểm tra sự tồn tại của tệp/thư mục

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

1. Giới thiệu

Tại sao cần kiểm tra sự tồn tại của file hoặc thư mục?

Hãy tưởng tượng bạn viết nhật ký, và trong ứng dụng có chức năng thêm mục vào cuối file. Mọi thứ ổn nếu file tồn tại. Nhưng nếu file bị xóa nhầm, chương trình sẽ ném lỗi, và tất cả ý tưởng thiên tài của bạn về ý nghĩa cuộc sống hoặc, tệ hơn, về thời tiết, sẽ biến mất. Tương tự, nếu bạn muốn tạo file mới để không mất dữ liệu, nên chắc chắn rằng file đó chưa tồn tại.

Trong dự án thực tế — đặc biệt là phát triển doanh nghiệp và công nghiệp — việc kiểm tra trước sự tồn tại của file và thư mục giúp tránh không chỉ lỗi do người dùng và sự cố nghiêm trọng, mà còn tiết kiệm thời gian và công sức cho team, và quan trọng là giảm đau đầu.

Làm việc với file system trong .NET

Trong nền tảng .NET để làm việc với file và thư mục chúng ta thường dùng các lớp chính sau (chúng nằm trong namespace System.IO):

  • File — static methods để làm việc với file: kiểm tra, copy, delete, v.v.
  • Directory — static methods để làm việc với thư mục.

Để kiểm tra sự tồn tại thì chỉ cần hai method sau:

  • File.Exists(path) — trả về true nếu file tồn tại.
  • Directory.Exists(path) — trả về true nếu thư mục tồn tại.

2. Kiểm tra file trước khi mở

Ví dụ thực tế

Giả sử bạn thêm chức năng hiển thị nội dung nhật ký:

string diaryPath = "diary.txt";
        
if (File.Exists(diaryPath))
{
    // File tồn tại, đọc và in nội dung
    using var reader = new StreamReader(diaryPath);
    string content = reader.ReadToEnd();
    Console.WriteLine("Nhật ký của bạn:\n" + content);
}
else
{
    Console.WriteLine("Không tìm thấy file nhật ký!");
    // Có thể tạo file mới ngay nếu cần
    File.WriteAllText(diaryPath, "Đây là khởi đầu của nhật ký của bạn.\n");
    Console.WriteLine("Đã tạo file nhật ký mới.");
}

Trong dự án thực tế cách này là must-have: bạn không trông chờ vào "phép màu", mà tự kiểm soát tình huống.

3. Kiểm tra file trước khi ghi

Tình huống: ứng dụng tạo báo cáo theo lịch. Cần đảm bảo mỗi báo cáo mới không ghi đè báo cáo trước.

Vì vậy hữu ích khi kiểm tra: biết đâu file đã tồn tại? Nếu có — bạn có thể yêu cầu user nhập tên khác hoặc tạo file với tên duy nhất.

string reportPath = "report.txt";
        
if (File.Exists(reportPath))
{
    Console.WriteLine($"File '{reportPath}' đã tồn tại. Hãy đổi tên hoặc xóa file cũ.");
}
else
{
    using var writer = new StreamWriter(reportPath);
    writer.WriteLine("Đây là báo cáo mới cho hôm nay!");
    Console.WriteLine("File báo cáo đã được tạo thành công.");
}

Việc kiểm tra như vậy sẽ tránh cho user (và bạn!) những bất ngờ khó chịu do file bị ghi đè.

4. Kiểm tra thư mục trước khi ghi

File hiếm khi nằm ở thư mục gốc của project. Thường chúng được đặt trong các thư mục riêng: logs/, reports/, data/ v.v. Trước khi ghi file nên đảm bảo thư mục cần thiết tồn tại.

string logsDir = "logs";
string logPath = Path.Combine(logsDir, "log.txt"); // Path.Combine giúp nối an toàn các phần của đường dẫn
        
if (!Directory.Exists(logsDir))
{
    Console.WriteLine("Không tìm thấy thư mục 'logs'. Đang tạo...");
    Directory.CreateDirectory(logsDir);
}

using var writer = new StreamWriter(logPath, append: true);
writer.WriteLine($"[{DateTime.Now}] Ứng dụng đã khởi động.");
Console.WriteLine("Ghi vào file log thành công.");

Nhân tiện, method Directory.CreateDirectory sẽ không ném lỗi nếu thư mục đã tồn tại — nó sẽ bỏ qua, nên bạn có thể không cần kiểm tra nếu thích cách này.

5. Những điểm quan trọng

Đặc điểm: đường dẫn tương đối và tuyệt đối

Lỗi phổ biến của người mới: nhầm đường dẫn tương đối và tuyệt đối. Ví dụ, nếu bạn viết File.Exists("data.txt"), chương trình sẽ tìm file trong thư mục làm việc hiện tại. Và thư mục đó là ở đâu? Tùy thuộc vào nơi ứng dụng được chạy.

Để an toàn hãy dùng đường dẫn tuyệt đối hoặc dựng đường dẫn bằng Path.Combine:

string myDocs = Environment.GetFolderPath(Environment.SpecialFolder.MyDocuments);
string filePath = Path.Combine(myDocs, "myapp", "settings.txt");

Đường dẫn được chỉ định rõ ràng, và bạn sẽ không bị mất file khỏi tầm nhìn.

Chi tiết quan trọng khi kiểm tra

  • Đôi khi kiểm tra xong nhưng ngay sau đó có hành động với cùng file/thư mục. Giữa File.Exists và thao tác tạo/xóa có thể có thời gian, và tiến trình khác có thể thay đổi trạng thái. Trong các scenario nghiêm trọng hãy bổ sung xử lý lỗi bằng try-catch.
  • Kiểm tra không chỉ sự tồn tại mà còn quyền truy cập. Có khi file tồn tại nhưng user không có quyền.
  • Dùng Directory.Exists cho thư mục, không dùng File.Exists — nếu dùng sai bạn luôn nhận false.
  • Nếu đường dẫn có nhiều thư mục lồng nhau, ví dụ "data/2024/04", thì Directory.CreateDirectory("data/2024/04") sẽ tạo toàn bộ chuỗi — tiện và tránh kiểm tra thừa.

Chuyện gì xảy ra nếu không kiểm tra?

Nếu bạn cố mở file không tồn tại để đọc — sẽ nhận FileNotFoundException. Nếu cố tạo file trong thư mục không tồn tại — DirectoryNotFoundException. Nếu chương trình chạy dưới quyền user, họ sẽ thấy lỗi và khó chịu. Nếu trong môi trường production — bạn mất dữ liệu/tiền/thời gian. Vậy nên "kiểm tra sự tồn tại" không phải việc phiền phức, mà là biểu hiện của việc quan tâm đến user (và sự bình an của não bạn).

2
Nhiệm vụ
C# SELF, mức độ, bài học
Đã khóa
Kiểm tra sự tồn tại của thư mục và tạo file trong đó
Kiểm tra sự tồn tại của thư mục và tạo file trong đó
Bình luận
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION