– Lớp FileStream của namespace System.IO trong C# hỗ trợ việc đọc và ghi file.
– Lớp FileStream kế thừa từ lớp abstract Stream.
– Mối liên hệ thừa kế của các class trong System.IO
– Cú pháp khai báo:
FileStream <object_name> = new FileStream(<file_path>, FileMode <Enumerator>, FileAccess <Enumerator>, FileShare <Enumerator>);
– Ví dụ: tạo một đối tượng FileStream là fs để đọc và ghi một file có tên sample.txt như sau:
FileStream fs = new FileStream("sample.txt", FileMode.OpenOrCreate, FileAccess.ReadWrite, FileShare.Read);
– Cần lưu ý 3 tham số sau:
1. Các tùy chọn của File Mode
Append
- Nếu file chưa tồn tại thì tạo file mới.
- Nếu file đã tồn tại thì mở file (mở ngầm), và đặt con trỏ tại cuối file để ghi file, do đó chỉ dùng kèm với FileAccess.Write, không dùng được với FileAccess.Read.
Create
- Nếu file chưa tồn tại thì tạo file mới.
- Nếu file đã tồn tại thì để nguyên không làm gì (không lỗi).
CreateNew
Luôn luôn tại file mới.
- Nếu file chưa tồn tại thì tạo file mới.
- Nếu file đã tồn tại thì chương trình sẽ lỗi (throw IOException).
Open
- Nếu file chưa tồn tại thì chương trình sẽ lỗi (throw FileNotFoundException).
- Nếu file đã tồn tại thì mở file.
OpenOrCreate
- Nếu file chưa tồn tại thì tạo file mới.
- Nếu file đã tồn tại thì mở file.
Truncate
- Nếu file chưa tồn tại thì chương trình sẽ lỗi (throw FileNotFoundException).
- Nếu file đã tồn tại thì mở file, xóa tất cả dữ liệu của file.
2. Các tùy chọn của File Access
- Read: mở file chỉ để đọc.
- ReadWrite: mở file để đọc và ghi.
- Write: mở file chỉ để ghi.
Lẽ ra thì chỉ cần 2 tham số FileMode và FileAccess là được rồi, tuy nhiên cũng có trường hợp cần đến tham số FileShare này để xử lý trường hợp deadlock, hoặc xử lý chiếm dụng tài nguyên.
※ Đôi khi hệ thống không chỉ có một chương trình chạy mà còn có rất nhiều chương trình, nhiều tiến trình (process),… cùng chạy. Giả sử file đang thao tác là một file hệ thống, có nhiều process dùng nó, khi đó cần dùng đến FileShare.
- Read: cho phép mở file chỉ để đọc.
- ReadWrite: cho phép mở file để đọc và ghi.
- Write: cho phép mở file chỉ để ghi.
- Inheriable: cho phép một file truyền tính kế thừa tới các tiến trình con.
- None: Từ chối việc chia sẻ file hiện tại.
– Demo đọc ghi file text sử dụng FileStream:
using System; using System.IO; using System.Text; namespace MinhHoangBlog { class Program { static void Main(string[] args) { FileStream fs = new FileStream("sample.txt", FileMode.OpenOrCreate, FileAccess.ReadWrite, FileShare.Read); /** * fs.Write() : Writes a block of bytes to the file stream * Bản chất là đọc ghi kiểu dữ liệu ở dạng byte (từng byte từng byte) của file. */ string strW = "Chào mừng bạn đến với Minh Hoàng Blog | www.minhhn.com"; // Chuyển một chuỗi thành mảng các byte theo mã hóa UTF8. byte[] arrByte = Encoding.UTF8.GetBytes(strW); // Ghi các byte xuống file: Write() /* Tham số 1: data để ghi vào file (The buffer containing data to write to the stream.) Tham số 2: offset là 0 (The zero-based byte offset in array from which to begin copying bytes to thestream.) Tham số 3: Độ dài của data dc ghi vào file (The maximum number of bytes to write.) */ fs.Write(arrByte, 0, arrByte.Length); Console.WriteLine("Write finish!"); // Đóng stream fs.Close(); /** * fs.Read(bytes, 0, bytes.Length); */ using (var readStream = new FileStream("sample.txt", FileMode.Open)) { //Khởi tạo mảng -> mỗi lần đọc là 100 bytes byte[] arrtmp = new byte[100]; UTF8Encoding encoding = new UTF8Encoding(true); int len = 0; // Đọc các phần tử trên luồng gán vào các phần tử của mảng temp. // (Gán vào các vị trí bắt đầu từ 0, mỗi lần đọc tối đa temp.Length phần tử) // Đồng thời trả về số byte đọc được. while (0 < (len = readStream.Read(arrtmp, 0, arrtmp.Length))) { // Chuyển mảng temp chứa các byte vừa đọc được thành chuỗi. // (Lấy 'len' phần tử bắt đầu từ vị trí 0). string strR = encoding.GetString(arrtmp, 0, len); Console.WriteLine(strR); } } Console.ReadKey(); } } }
Có thể bạn quan tâm:
– Thao tác với tập tin và thư mục trong C#.
– Thao tác với đường dẫn Path và DriveInfo trong C#.
Cách read Logfile khi phần mềm xử lý mã code SN sai ? Đọc theo từng dòng ntn ?