Lập trình C#

Lớp FileStream đọc và ghi file trong C#

Lớp FileStream đọc và ghi file trong C#
Được viết bởi Minh Hoàng

Series lập trình C#, ngôn ngữ lập trình hiện đại và mạnh mẽ.

– 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

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 FileStreamfs để đọ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. File Mode
  2. File Access
  3. File Share
1. File Mode
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. File Access
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.
3. File Share
3. Các tùy chọn của File Share

Lẽ ra thì chỉ cần 2 tham số FileModeFileAccess 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ảm ơn bạn đã theo dõi. Đừng ngần ngại hãy cùng thảo luận với chúng tôi!

Giới thiệu

Minh Hoàng

Xin chào, tôi là Hoàng Ngọc Minh, hiện đang làm BrSE, tại công ty Toyota, Nhật Bản. Những gì tôi viết trên blog này là những trải nghiệm thực tế tôi đã đúc rút ra được trong cuộc sống, quá trình học tập và làm việc. Các bài viết được biên tập một cách chi tiết, linh hoạt để giúp bạn đọc có thể tiếp cận một cách dễ dàng nhất. Hi vọng nó sẽ có ích hoặc mang lại một góc nhìn khác cho bạn[...]

1 bình luận

  • Cách read Logfile khi phần mềm xử lý mã code SN sai ? Đọc theo từng dòng ntn ?

Translate »