Class File berperilaku seperti pintu cepat: satu panggilan untuk membaca atau menulis seluruh isi. Di balik pintu itu, .NET sebenarnya membuat FileStream. Class inilah yang mengendalikan detail tingkat rendah: berkas mana yang dibuka, untuk dibaca atau ditulis, mulai dari posisi mana, dan buffer sebesar apa. Membuat FileStream secara manual diperlukan ketika kita menginginkan kontrol penuh, misalnya menulis sebagian byte pada posisi tertentu.

FileMode dan FileAccess #

Dua enum menentukan perilaku pembukaan. FileMode menyatakan apa yang dilakukan sistem operasi terhadap berkas, sedangkan FileAccess menyatakan izinnya: Read, Write, atau ReadWrite:

FileModeBila berkas sudah adaBila berkas tidak ada
Createditimpa dari awaldibuat baru
OpendibukaFileNotFoundException dilempar
OpenOrCreatedibukadibuat baru

Contoh Menulis dan Membaca Byte #

Contoh berikut membuka berkas dua kali: pertama untuk menulis empat byte, kedua untuk membacanya ke buffer:

csharp
string dir = Path.Combine(Path.GetTempPath(), "verify-6c", "filestream");
Directory.CreateDirectory(dir);
string path = Path.Combine(dir, "blok.bin");

using (FileStream aliran = new FileStream(path, FileMode.Create, FileAccess.Write))
{
    byte[] data = { 0x10, 0x20, 0x30, 0x40 };
    aliran.Write(data, 0, data.Length);
    Console.WriteLine($"Posisi setelah menulis: {aliran.Position}");
}

using FileStream pembaca = new FileStream(path, FileMode.Open, FileAccess.Read);
byte[] buffer = new byte[8];
int terbaca = pembaca.Read(buffer, 0, buffer.Length);
Console.WriteLine($"Terbaca: {terbaca} byte");
Console.WriteLine(BitConverter.ToString(buffer, 0, terbaca));

Output yang Dihasilkan:

text
Posisi setelah menulis: 4
Terbaca: 4 byte
10-20-30-40

Mari kita bedah baris demi baris:

  1. FileMode.Create dan FileAccess.Write: membuka berkas khusus untuk menulis; berkas lama, bila ada, ditimpa dari byte nol.
  2. aliran.Write(data, 0, data.Length): menulis seluruh array mulai dari offset 0 array; argumen offset dan jumlah inilah kontrol tambahan yang tidak dimiliki File.WriteAllBytes.
  3. aliran.Position: kursor berpindah dari 0 ke 4, menunjuk byte berikutnya yang akan ditulis.
  4. pembaca.Read(buffer, 0, buffer.Length): mengisi buffer dari posisi sekarang dan mengembalikan jumlah byte yang benar-benar terbaca, yaitu 4.
  5. BitConverter.ToString(buffer, 0, terbaca): hanya memformat 4 byte pertama; dua byte terakhir buffer tetap bernilai 0 karena tidak pernah diisi.