CodeGym /Các khóa học /C# SELF /Lớp Path — trợ thủ ...

Lớp Path — trợ thủ của bạn khi làm việc với đường dẫn

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

1. Giới thiệu

Tại sao cần lớp Path?

Làm việc với file không thể tách rời việc làm việc với đường dẫn của chúng. Đường dẫn cho chương trình biết phải tìm file hoặc thư mục ở đâu.

Trong đời thực bạn có địa chỉ: tp. [Tên thành phố], đ. [Tên đường], số [Số nhà]. Với máy tính, đường dẫn tới file trông như thế này:
"C:\Program Files\MyApp\data.txt"
hoặc, nếu bạn thích đa nền tảng:
"/home/username/documents/data.txt"

Nhưng vấn đề là: các OS khác nhau dùng ký tự phân cách khác nhau, có thể có giới hạn về độ dài hoặc ký tự hợp lệ. Ngay cả người dùng nhập tay đường dẫn cũng có thể sai: không phải ai cũng biết về những backslash đôi (\\) trong Windows hoặc rằng trong hệ Unix-like đường dẫn bắt đầu bằng /.

Để khỏi tự chế bánh xe, .NET cung cấp lớp tĩnh đặc biệt System.IO.Path, nó đảm nhiệm việc phân tích, thay đổi và ghép đường dẫn. Giờ hãy làm quen với siêu anh hùng này nhé!

Các nhiệm vụ chính mà Path giải quyết

  • Lấy phần mở rộng của file.
  • Lấy tên file hoặc thư mục từ đường dẫn đầy đủ.
  • Xây dựng đường dẫn tuyệt đối và tương đối từ các mảnh nhỏ.
  • Kiểm tra xem đường dẫn có hợp lệ trên OS đó không.
  • Thay đổi phần mở rộng file.
  • Xác định thư mục gốc và các thư mục cha.
  • Làm việc đa nền tảng với ký tự phân cách đường dẫn.
  • Làm việc với file và thư mục tạm thời.

Bảng: Các phương thức và thuộc tính chính của Path

Phương thức/Thuộc tính Làm gì
GetFileName(path)
Tên file kèm phần mở rộng
GetExtension(path)
Phần mở rộng của file (ví dụ, .txt)
GetDirectoryName(path)
Đường dẫn tới thư mục chứa file
GetFileNameWithoutExtension(path)
Tên file không có phần mở rộng
Combine(...)
Ghép các phần của đường dẫn một cách cẩn thận và đa nền tảng
ChangeExtension(path, ext)
Thay đổi phần mở rộng của file
GetFullPath(path)
Đường dẫn tuyệt đối
GetInvalidPathChars()
Ký tự bị cấm trong đường dẫn
GetInvalidFileNameChars()
Ký tự bị cấm trong tên file
GetTempPath()
Đường dẫn tới thư mục cho file tạm
GetTempFileName()
Tạo file tạm và trả về đường dẫn tới nó
DirectorySeparatorChar
Ký tự phân cách thư mục (ví dụ, \ hoặc /)
AltDirectorySeparatorChar
Ký tự phân cách thay thế
PathSeparator
Ký tự phân cách đường dẫn trong biến môi trường (; hoặc :)

2. Lấy các phần của đường dẫn

Hầu hết các phương thức của lớp Path là tĩnh. Không cần tạo instance — cứ gọi Path.MethodName(...).

Các công cụ thường dùng: GetFileName, GetDirectoryName, GetExtension, GetFileNameWithoutExtension. Lúc nào cũng có thể cần lấy tên file không có đường dẫn, chỉ phần mở rộng hoặc thư mục chứa nó.

Ví dụ:


using System;
using System.IO;

string path = @"C:\Projects\MyApp\data\info.json";

Console.WriteLine(Path.GetFileName(path));               // info.json
Console.WriteLine(Path.GetFileNameWithoutExtension(path)); // info
Console.WriteLine(Path.GetExtension(path));              // .json
Console.WriteLine(Path.GetDirectoryName(path));          // C:\Projects\MyApp\data
Kết quả
@"C:\Projects\MyApp\data\info.json"
info.json
Path.GetFileName(path)
Path.GetExtension(path)
.json
Path.GetFileNameWithoutExtension(path)
info
Path.GetDirectoryName(path)
C:\Projects\MyApp\data

3. Ghép đường dẫn: Combine

Lỗi phổ biến của người mới — ghép đường dẫn bằng cộng chuỗi. Đừng làm thế!

Ví dụ mã sai:


// Có rủi ro lỗi!
string fullPath = "C:\\Projects\\MyApp\\" + "data\\info.json";

Nếu quên dấu slash/backslash thì sao? Hoặc dùng nhầm ký tự phân cách?
Cách đúng — dùng Path.Combine.


string folder = @"C:\Projects\MyApp";
string filename = "data\\info.json";

string fullPath = Path.Combine(folder, filename);

// Trên mọi nền tảng sẽ ghép đúng các đoạn đường dẫn!
Console.WriteLine(fullPath); // C:\Projects\MyApp\data\info.json

Làm việc với đường dẫn tương đối

Nếu truyền đường dẫn tương đối, Path.Combine sẽ xử lý đúng. Cố gắng tách đường dẫn thành các đoạn nhỏ!


string baseDir = "C:/work";
string subDir = "docs";
string file = "readme.txt";

string path = Path.Combine(baseDir, subDir, file);
// Kết quả: "C:/work/docs/readme.txt" (hoặc với backslash — tùy nền tảng)

Sự thật cho người biết chuyện: bên trong Path.Combine dùng ký tự phân cách đúng cho hệ của bạn. Trên Windows — \, trên Linux/Mac — /. Code bạn trở nên đa nền tảng mà không cần nghĩ nhiều!

4. Kiểm tra hợp lệ của đường dẫn

Có các phương thức đặc biệt: GetInvalidPathChars, GetInvalidFileNameChars.

Giả sử người dùng nhập tên file hoặc đường dẫn qua giao diện. Làm sao đảm bảo chuỗi không chứa ký tự bị cấm? Hỏi Path thôi.


char[] invalidPathChars = Path.GetInvalidPathChars();
char[] invalidFileNameChars = Path.GetInvalidFileNameChars();

string userInput = "data*?.txt";
foreach (char c in userInput)
{
    if (Array.Exists(invalidFileNameChars, x => x == c))
    {
        Console.WriteLine($"Ký tự không hợp lệ trong tên file: {c}");
    }
}
// In ra: Ký tự không hợp lệ trong tên file: *

Điều này đặc biệt quan trọng nếu chương trình nhận đường dẫn từ người dùng hoặc nguồn không đáng tin cậy!

5. Các phương thức hữu ích

Đổi phần mở rộng file: ChangeExtension

Đôi khi cần đổi phần mở rộng sang cái khác. Chỉ một dòng là xong!


string oldPath = @"C:\data\report.csv";
string newPath = Path.ChangeExtension(oldPath, ".bak");

Console.WriteLine(newPath); // C:\data\report.bak

ChangeExtension không động tới phần còn lại của đường dẫn — chỉ thay "đuôi".

Lấy đường dẫn tuyệt đối: GetFullPath

Nếu đường dẫn là tương đối, bạn có thể lấy đường dẫn tuyệt đối bằng phương thức này.


string relPath = @"..\..\logs\2024.log";
string absPath = Path.GetFullPath(relPath);

Console.WriteLine(absPath);
// Ví dụ: C:\Projects\MyApp\logs\2024.log

Kết quả thực tế phụ thuộc vào thư mục làm việc hiện tại của ứng dụng (Directory.GetCurrentDirectory()).

Ký tự phân cách đường dẫn: Path.DirectorySeparatorChar

Nhớ lại, trên Windows phân cách là \, còn trên Linux là /.
Đừng mò mẫm — dùng mấy thuộc tính này:

  • Path.DirectorySeparatorChar — ký tự phân cách chính cho thư mục trên OS của bạn ('\\' cho Windows, '/' cho Linux).
  • Path.AltDirectorySeparatorChar — ký tự phân cách thay thế ('/' cũng có thể hoạt động trên Windows).
  • Path.PathSeparator — ký tự phân cách đường dẫn trong biến môi trường (';' cho Windows, ':' cho Linux).

Cách dùng:


Console.WriteLine(Path.DirectorySeparatorChar);     // \  (trên Windows)
Console.WriteLine(Path.AltDirectorySeparatorChar);  // /  (trên Windows)
Console.WriteLine(Path.PathSeparator);              // ;  (trên Windows)

Điều này hữu ích khi, ví dụ, bạn tự xây công cụ để duyệt thư mục!

6. Làm việc với file và thư mục tạm thời

Ứng dụng đôi khi cần file tạm — ví dụ để lưu kết quả trung gian hoặc cập nhật dữ liệu một cách nguyên tử.

  • Path.GetTempPath() — trả về đường dẫn tới thư mục hệ thống dành cho file tạm.
  • Path.GetTempFileName() — tạo file tạm với tên duy nhất và trả về đường dẫn tới nó.

Ví dụ:


string tempDir = Path.GetTempPath();
Console.WriteLine($"Thư mục cho file tạm: {tempDir}");

string tempFile = Path.GetTempFileName();
Console.WriteLine($"Đã tạo file tạm: {tempFile}");

Những phương thức này cứu bạn khỏi xung đột tên và lo lắng chỗ để lưu file kỹ thuật.

7. Lỗi thường gặp và tình huống vui với đường dẫn

Thứ nhất, thói quen ghép đường dẫn bằng cộng chuỗi. "Ồ, dễ mà: folder + "\\\" + file"! Thực tế: double slash, thiếu slash, ký tự phân cách sai trên Linux. Tất cả đều có thể xảy ra nếu bạn không dùng Path.Combine.

Thứ hai, quên ký tự bị cấm. Ví dụ, người dùng nhập * ("dấu sao") trong tên file — sẽ nhận exception.

Thứ ba, nhầm đường dẫn tương đối và tuyệt đối, khiến chương trình tìm file "notebook.txt" không ở chỗ bạn nghĩ.

Mẹo: khi tương tác với đường dẫn file — ghép, phân tích, đổi phần mở rộng, chống lỗi — hãy tự hỏi: "Công việc này có thể giải quyết bằng một phương thức của Path không?" Với xác suất 99% — có, và phương thức đó đã được team Microsoft test với đủ các edge-case điên rồ.

1
Khảo sát/đố vui
, cấp độ , bài học
Không có sẵn
Các lớp File và Directory
Làm việc với hệ thống file
Bình luận
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION