Xử lý file đóng vai trò quan trọng trong các ứng dụng doanh nghiệp. Để hỗ trợ chức năng này, Microsoft .NET Framework cung cấp namespace System.IO, chứa các lớp cho việc xử lý Input/Output (I/O).
File I/O trong ngôn ngữ lập trình C# là gì?
Ngoài ra, namespace System.IO hỗ trợ thao tác với file và thư mục trong hệ thống tập tin của hệ điều hành. Trong bài viết này, Mytour sẽ giới thiệu về File I/O trong C# và cách sử dụng các lớp trong namespace System.IO để đọc và ghi dữ liệu vào file.
1. Sử dụng lớp File để đọc và ghi dữ liệu.
1.1. Đọc dữ liệu từ file.
1.2. Ghi dữ liệu vào file.
2. Sử dụng lớp File và FileInfo để thao tác các file.
2.1. Sử dụng lớp File để thao tác các file.
2.2. Sử dụng lớp FileInfo để thao tác các file.
2.3. Khởi tạo lớp FileInfo.
3. Sử dụng các lớp DirectoryInfo và Directory để thao tác các thư mục.
3.1. Sử dụng lớp Directory để thao tác thư mục.
3.2. Sử dụng lớp DirectoryInfo để thao tác thư mục.
3.3. Khởi tạo lớp DirectoryInfo.
1. Sử dụng lớp File để đọc và ghi dữ liệu
Lớp File trong namespace System.IO cung cấp các phương thức tĩnh cho việc đọc và ghi file trực tiếp. Để đọc dữ liệu từ file, chúng ta cần:
- Một file cần xử lý.
- Tạo một file stream.
- Chỉ định bộ đệm dữ liệu file.
- Giải phóng file sau khi xử lý.
1.1. Đọc dữ liệu từ file
Dưới đây là danh sách các phương thức đọc dữ liệu từ file trong C#:
- Phương thức 'ReadAllText' đọc dữ liệu của file:
string filePath = @'C:\MyData\TestFile.txt';
string testData = File.ReadAllText(filePath);
- Phương thức 'ReadAllLines' đọc tất cả nội dung của file và lưu mỗi dòng thành một phần tử trong mảng kiểu chuỗi:
string filePath = @'C:\MyData\TestFile.txt';
string[] testDataLineByLine = File.ReadAllLines(filePath);
- Phương thức 'ReadAllBytes' đọc nội dung của file dưới dạng dữ liệu nhị phân và lưu trữ dữ liệu trong một mảng byte.
string filePath = @'C:\MyData\TestFile.txt';
byte[] testDataRawBytes = File.ReadAllBytes(filePath);
Mỗi phương thức trên cho phép nhà phát triển đọc nội dung của file và tải vào bộ nhớ. Phương thức ReadAllText giúp lưu trữ toàn bộ file trong bộ nhớ chỉ bằng một thao tác. Phương thức ReadAllLines sẽ đọc từng dòng một và lưu thành một mảng.
1.2. Ghi dữ liệu vào file
Lớp File cũng cung cấp các phương thức để ghi các loại dữ liệu khác nhau vào một file. Với mỗi loại dữ liệu mà bạn viết, lớp File cung cấp 2 phương thức.
Khi file không tồn tại, các phương thức Writexxx sẽ tạo một file mới với dữ liệu mới. Trong trường hợp file đã tồn tại, chúng sẽ ghi đè lên file hiện tại với dữ liệu mới.
Nếu file được chỉ định không tồn tại, các phương thức Appendxxx cũng tạo một file mới với dữ liệu mới. Trong trường hợp file đã tồn tại, dữ liệu mới sẽ được ghi vào cuối file hiện tại.
Dưới đây là chi tiết về các phương thức ghi dữ liệu vào file:
- Phương thức 'WriteAllText' cho phép ghi nội dung của biến chuỗi vào file. Nếu file đã tồn tại, nội dung của file sẽ bị ghi đè. Ví dụ dưới đây minh họa cách ghi nội dung của chuỗi có tên là settings vào file mới có tên settings.txt:
string filePath = @'C:\MyData\TestFile.txt';
string data = 'C# Corner MVP & Microsoft MVP;';
File.WriteAllText(filePath, data);
- Sử dụng phương thức 'WriteAllLines', nhà phát triển có thể ghi nội dung của mảng chuỗi vào file. Mỗi phần tử trong mảng sẽ tạo một dòng mới trong file mới. Ví dụ dưới đây minh họa cách ghi nội dung của mảng chuỗi có tên là data vào file mới:
string filePath = @'C:\MyData\TestFile.txt';
string[] data = { 'MCT', 'MCPD', 'MCTS', 'MCSD.NET', 'MCAD.NET', 'CSM' };
File.WriteAllLines(filePath, data);
- Sử dụng phương thức 'AppendAllText', nhà phát triển có thể ghi nội dung của biến chuỗi vào cuối file hiện tại. Ví dụ dưới đây minh họa cách ghi nội dung của chuỗi có tên là data vào cuối file hiện tại:
string filePath = @'C:\MyData\TestFile.txt';
string data = 'Also Certified from IIT Kharagpur';
File.AppendAllText(filePath, data);
- Sử dụng phương thức 'AppendAllLines', nhà phát triển có thể ghi nội dung của mảng chuỗi vào cuối file hiện tại. Mỗi phần tử trong mảng sẽ tạo một dòng mới trong file hiện tại. Ví dụ dưới đây minh họa cách ghi nội dung của mảng chuỗi có tên là otherData vào cuối file hiện tại:
string filePath = @'C:\MyData\TestFile.txt';
string[] otherData = { 'Worked with Microsoft', 'Lived in USA' };
File.AppendAllLines(filePath, otherData);
2. Sử dụng lớp File và FileInfo để thao tác các file
Thao tác với file đóng vai trò quan trọng, không kém phần quan trọng như việc tạo mới chúng. Trong nhiều trường hợp, ứng dụng đòi hỏi khả năng tương tác linh hoạt với các file đã lưu trữ trên hệ thống tập tin. Ví dụ như việc di chuyển một file từ thư mục này sang thư mục khác để thực hiện các xử lý cần thiết.
Bằng cách sử dụng các lớp File và FileInfo, nhà phát triển có thể dễ dàng thực hiện những tác vụ này.
2.1. Sử dụng lớp File để thao tác các file
Lớp File bao gồm nhiều phương thức tĩnh hữu ích mà nhà phát triển có thể áp dụng để thực hiện các thao tác cơ bản trên file. Dưới đây là chi tiết về một số phương thức sử dụng lớp File để thao tác với các file:
- Sử dụng phương thức 'Copy' để sao chép một file vào một thư mục khác trong hệ thống tập tin.
string nguonDuongDan = @'C:\MyData\TestFile.txt';
string dichDuongDan = @'C:\temp\Data.txt';
bool ghiDe = true;
File.Copy(nguonDuongDan, dichDuongDan, ghiDe);
Lưu ý: Tham số ghi đè được truyền vào lệnh gọi phương thức Copy, xác định rằng quá trình sao chép sẽ ghi đè lên file hiện tại nếu nó đã tồn tại tại đường dẫn đích. Trong trường hợp truyền sai lệnh gọi phương thức Copy và file đã tồn tại, Common Language Runtime (CLR) sẽ tạo ra ngoại lệ System.IO.IOException.
- Sử dụng phương thức 'Delete' để xóa một file khỏi hệ thống tập tin.
string nguonDuongDan = @'C:\MyData\TestFile.txt';
File.Delete(nguonDuongDan);
- Sử dụng phương thức 'Exists' để kiểm tra xem một file có tồn tại trên hệ thống tập tin hay không.
string nguonDuongDan = @'C:\MyData\TestFile.txt';
bool coTonTai = File.Exists(nguonDuongDan);
- Sử dụng phương thức 'GetCreationTime' để lấy dấu thời gian mô tả khi file được tạo từ siêu dữ liệu (metadata) liên kết với file.
string duongDanNguon = @'C:\MyData\TestFile.txt';
DateTime fileDuocTaoLuc = File.GetCreationTime(duongDanNguon)
2.2. Sử dụng lớp FileInfo để thao tác các file
Khác biệt với lớp File, lớp FileInfo cung cấp các thành phần biến thể bạn có thể sử dụng để thao tác trên các file hiện tại. Trong khi lớp File cung cấp các phương thức tĩnh để thao tác trực tiếp, lớp FileInfo hoạt động như biểu diễn bộ nhớ vật lý của file.
2.3. Khởi tạo lớp FileInfo
string duongDanNguon = @'C:\MyData\TestFile.txt';
FileInfo thongTinFile = new FileInfo(duongDanNguon);
Sau khi biến thể của lớp FileInfo được tạo, bạn có thể sử dụng các thuộc tính và phương thức để tương tác với file. Dưới đây là danh sách chi tiết các thuộc tính và phương thức khởi tạo lớp FileInfo:
- Sử dụng phương thức 'CopyTo' để sao chép file hiện có vào một thư mục khác trên hệ thống tập tin.
string duongDanNguon = @'C:\MyData\TestFile.txt';
string duongDanDich = @'C:\temp\Data.txt';
bool ghiDe = true;
FileInfo thongTinFile = new FileInfo(duongDanNguon);
thongTinFile.CopyTo(duongDanDich, ghiDe);
Lưu ý: Tham số ghi đè trong phương thức CopyTo cho biết quá trình sao chép sẽ ghi đè lên file hiện có nếu file tồn tại ở đường dẫn file đích đã chỉ định. Nếu truyền sai phương thức CopyTo và file đã tồn tại, CLR sẽ ném ngoại lệ System.IO.IOException.
- Sử dụng phương thức 'Delete' để xóa một file.
string duongDanNguon = @'C:\MyData\TestFile.txt';
FileInfo thongTinFile = new FileInfo(duongDanNguon);
thongTinFile.Delete();
- Thuộc tính 'DirectoryName' cho phép lấy đường dẫn thư mục đến file.
string duongDanNguon = @'C:\MyData\TestFile.txt';
FileInfo thongTinFile = new FileInfo(duongDanNguon);
string duongDanThuMuc = thongTinFile.DirectoryName;
// trả về C:\MyData
- Sử dụng phương thức 'Exists' để xác định xem file có tồn tại trong hệ thống tập tin hay không.
string duongDanNguon = @'C:\MyData\TestFile.txt';
FileInfo thongTinFile = new FileInfo(duongDanNguon);
bool fileTonTai = thongTinFile.Exists;
- Thuộc tính 'Extension' cho phép lấy phần đuôi mở rộng của file.
string duongDanNguon = @'C:\MyData\TestFile.txt';
FileInfo thongTinFile = new FileInfo(duongDanNguon);
string duoiFile = thongTinFile.Extension;
- Sử dụng thuộc tính 'Length' để lấy kích thước của file theo byte.
string duongDanNguon = @'C:\MyData\TestFile.txt';
FileInfo thongTinFile = new FileInfo(duongDanNguon);
long kichThuoc = thongTinFile.Length;
3. Sử dụng lớp DirectoryInfo và Directory để thao tác thư mục
Trong cấu trúc tệp của hệ điều hành, các tệp được phân loại và tổ chức trong các thư mục. Việc tương tác và thao tác với cấu trúc thư mục của hệ thống tệp là rất quan trọng.
Tương tác với thư mục bao gồm việc kiểm tra xem thư mục tồn tại trước khi ghi tệp hoặc xóa thư mục sau khi quá trình hoàn tất. Thư viện lớp .NET Framework có các lớp Directory và DirectoryInfo để thực hiện những hoạt động này.
3.1. Sử dụng lớp Directory để thao tác thư mục
Giống như lớp File, lớp Directory cung cấp những phương thức tĩnh giúp bạn tương tác với thư mục mà không cần tạo đối tượng thư mục trong mã nguồn của bạn.
- Phương thức 'CreateDirectory' tạo ra một thư mục mới trong hệ thống tệp.
string duongDanThuMucNguon = @'C:\MyData\Data';
Directory.CreateDirectory(duongDanThuMucNguon);
- Phương thức 'Delete' xóa thư mục tại một đường dẫn cụ thể.
string duongDanThuMucNguon = @'C:\MyData\Data';
bool xoaMucCon = true;
Directory.Delete(duongDanThuMucNguon, xoaMucCon);
Lưu ý: Tham số xoaMucCon được truyền vào phương thức Delete để xác định xem có nên xóa tất cả nội dung có thể tồn tại trong thư mục hay không. Nếu truyền sai vào phương thức Delete và thư mục không trống, CLR sẽ ném ngoại lệ System.IO.IOException.
- Phương thức 'Exists' kiểm tra xem thư mục có tồn tại trên hệ thống tập tin hay không.
string duongDanThuMucNguon = @'C:\MyData\Data';
bool tonTaiThuMucTempData = Directory.Exists(duongDanThuMucNguon);
- Phương thức 'GetDirectories' trả về danh sách tất cả các thư mục con trong một thư mục cụ thể trên hệ thống tập tin.
string duongDanThuMucNguon = @'C:\MyData\Data';
string[] thuMucCon = Directory.GetDirectories(duongDanThuMucNguon);
- Phương thức 'GetFiles' lấy danh sách tất cả các file trong một thư mục cụ thể trên hệ thống tập tin.
string duongDanThuMucNguon = @'C:\MyData\Data';
string[] files = Directory.GetFiles(duongDanThuMucNguon);
Lớp DirectoryInfo cung cấp các thành viên biến thể, giúp bạn truy cập siêu dữ liệu thư mục và thao tác cấu trúc thư mục.
3.2. Sử dụng lớp DirectoryInfo để thao tác thư mục
Lớp DirectoryInfo đóng vai trò như một biểu diễn trong bộ nhớ cho thư mục. Để truy cập các thuộc tính và thực hiện các phương thức của lớp DirectoryInfo, trước tiên chúng ta cần tạo một biến thể của lớp này.
3.3. Khởi tạo lớp DirectoryInfo
string duongDanThuMucNguon = @'C:\MyData\Data';
DirectoryInfo thuMuc = new DirectoryInfo(duongDanThuMucNguon);
Khi tạo một biến thể của lớp DirectoryInfo, bạn có thể sử dụng các thuộc tính và phương thức của nó để tương tác với thư mục. Dưới đây là thông tin chi tiết về một số thuộc tính và phương thức hữu ích của lớp DirectoryInfo:
- Phương thức 'Create' tạo một thư mục mới trên hệ thống tập tin.
string duongDanThuMucNguon = @'C:\MyData\Data';
DirectoryInfo thuMuc = new DirectoryInfo(duongDanThuMucNguon);
thuMuc.Create();
- Phương thức 'Delete' xóa thư mục tại đường dẫn cụ thể.
string duongDanThuMucNguon = @'C:\MyData\Data';
bool xoaThuMucNhanh = true;
DirectoryInfo thuMuc = new DirectoryInfo(duongDanThuMucNguon);
thuMuc.Delete(xoaThuMucNhanh);
Lưu ý: Tham số xoaNoiDungCon được truyền vào lệnh gọi phương thức Delete, xác định xem quá trình xóa có nên xóa các nội dung con tồn tại trong thư mục hay không. Nếu truyền sai vào phương thức Delete, và thư mục không trống, sau đó CLR sẽ ném ngoại lệ System.IO.IOException.
- Phương thức 'Exist' kiểm tra xem thư mục có tồn tại trên hệ thống tập tin không.
string duongDanThuMucNguon = @'C:\MyData\Data';
DirectoryInfo thuMuc = new DirectoryInfo(duongDanThuMucNguon);
bool thuMucTonTai = thuMuc.Exists
- Thuộc tính 'FullPath' trả về đường dẫn đầy đủ đến thư mục. Ví dụ dưới đây mô tả cách để lấy đường dẫn đầy đủ đến thư mục tempData.
string duongDanThuMucNguon = @'C:\MyData\Data';
DirectoryInfo thuMuc = new DirectoryInfo(duongDanThuMucNguon);
string duongDanDayDu = thuMuc.FullName;
- Phương thức 'LayDanhSachThuMucCon' trả về danh sách tất cả các thư mục con trong thư mục cụ thể trên hệ thống tập tin. Khác với phương thức tĩnh File.GetDirectories, phương thức biến thể này trả về mảng kiểu DirectoryInfo, cho phép bạn sử dụng từng thuộc tính biến thể cho mỗi thư mục con.
string duongDanThuMucNguon = @'C:\MyData\Data';
DirectoryInfo thuMuc = new DirectoryInfo(duongDanThuMucNguon);
DirectoryInfo[] thuMucCon = thuMuc.GetDirectories();
- Phương thức 'LayDanhSachTep' trả về danh sách tất cả các file trong thư mục cụ thể trên hệ thống tập tin. Khác với phương thức tĩnh File.GetFiles, phương thức biến thể này trả về mảng kiểu FileInfo, cho phép bạn sử dụng từng thuộc tính biến thể cho mỗi file.
string duongDanThuMucNguon = @'C:\MyData\Data';
DirectoryInfo thuMuc = new DirectoryInfo(duongDanThuMucNguon);
FileInfo[] tepCon = thuMuc.GetFiles();
Dựa vào nhu cầu tiếp cận từng dòng mã đơn giản để thao tác một thư mục, lớp Directory hoặc lớp DirectoryInfo sẽ đáp ứng đúng yêu cầu của bạn.
Bài viết trên đây trình bày về file I/O trong C#. Nếu có câu hỏi hoặc thắc mắc, bạn đọc có thể chia sẻ ý kiến tại phần bình luận dưới bài viết. Bạn cũng có thể tham khảo những thông tin về xử lý ngoại lệ trong C# trên Mytour để hiểu rõ hơn.