C# File IO ve Stream API
C#’ta File IO ve Stream API kullanımını öğrenin. Dosya okuma, yazma ve veri akışı işlemleri örneklerle anlatılıyor.
C#’ta File IO (Input/Output) ve Stream API, dosya okuma ve yazma işlemleri için kullanılan en temel mekanizmalardır.
Dosyalar üzerinde metin veya ikili (binary) işlemler yapılabilir, ayrıca stream (akış) mantığı ile büyük veriler bellek dostu şekilde işlenebilir.
Bu makalede File, FileInfo, StreamReader/StreamWriter,
FileStream ve BinaryReader/BinaryWriter gibi sınıflar kapsamlı örneklerle anlatılacaktır.
File Sınıfı
File sınıfı statik metotlarla hızlı dosya işlemleri yapmayı sağlar.
En sık kullanılan metotlar: WriteAllText, ReadAllText, AppendAllText, Exists, Delete.
using System;
using System.IO;
// Dosya yazma
File.WriteAllText("deneme.txt", "Merhaba Dünya!");
// Dosya okuma
string icerik = File.ReadAllText("deneme.txt");
Console.WriteLine(icerik);
// Dosya var mı?
if (File.Exists("deneme.txt"))
Console.WriteLine("Dosya mevcut.");
// Dosyaya ekleme
File.AppendAllText("deneme.txt", "\nYeni satır eklendi.");
// Dosya silme
File.Delete("gecici.txt");
FileInfo Sınıfı
FileInfo örnek tabanlıdır ve dosya üzerinde detaylı bilgi veya işlem yapma imkânı sunar.
Exists, Create, Delete, CopyTo ve MoveTo gibi metotlar içerir.
var info = new FileInfo("ornek.txt");
// Dosya yoksa oluştur
if (!info.Exists)
{
using (var sw = info.CreateText())
sw.WriteLine("Bu dosya FileInfo.Create ile oluşturuldu.");
}
// Dosya bilgilerini yazdır
Console.WriteLine($"Ad: {info.Name}, Boyut: {info.Length} bayt, Yol: {info.FullName}");
// Dosyayı kopyala
info.CopyTo("ornek_kopya.txt", overwrite: true);
// Dosyayı taşı
info.MoveTo("yeni_ornek.txt");
// Dosyayı sil
var silinecek = new FileInfo("yeni_ornek.txt");
if (silinecek.Exists)
silinecek.Delete();
StreamReader ve StreamWriter
StreamReader ve StreamWriter, metin tabanlı dosya işlemleri için kullanılır.
using bloğu sayesinde dosya otomatik olarak kapanır.
// Dosyaya yazma
using (var writer = new StreamWriter("metin.txt"))
{
writer.WriteLine("Satır 1");
writer.WriteLine("Satır 2");
}
// Dosyadan okuma
using (var reader = new StreamReader("metin.txt"))
{
string satir;
while ((satir = reader.ReadLine()) != null)
Console.WriteLine(satir);
}
// Çıktı:
// Satır 1
// Satır 2
FileStream
FileStream, dosyaları bayt seviyesinde okuma/yazma imkanı sağlar.
Özellikle resim, video gibi büyük dosyalarla çalışırken tercih edilir.
// Dosyaya bayt yazma
byte[] veri = { 72, 101, 108, 108, 111 }; // "Hello"
using (var fs = new FileStream("veri.bin", FileMode.Create))
{
fs.Write(veri, 0, veri.Length);
}
// Dosyadan bayt okuma
using (var fs = new FileStream("veri.bin", FileMode.Open))
{
int b;
while ((b = fs.ReadByte()) != -1)
Console.Write((char)b);
}
// Çıktı: Hello
BinaryReader ve BinaryWriter
BinaryReader ve BinaryWriter, ilkel veri tiplerini (int, double, string vb.) doğrudan binary akışına yazıp okumak için kullanılır.
using (var bw = new BinaryWriter(File.Open("sayilar.dat", FileMode.Create)))
{
bw.Write(42);
bw.Write(3.14);
bw.Write("Merhaba");
}
using (var br = new BinaryReader(File.Open("sayilar.dat", FileMode.Open)))
{
int i = br.ReadInt32();
double d = br.ReadDouble();
string s = br.ReadString();
Console.WriteLine($"{i}, {d}, {s}");
}
// Çıktı: 42, 3.14, Merhaba
Örnek Uygulama: Log Dosyası Yönetimi
Aşağıdaki örnekte uygulama logları StreamWriter ile bir dosyaya yazılmakta,
daha sonra StreamReader ile okunmaktadır.
Ayrıca, FileInfo ile dosyanın varlığı kontrol edilmekte, yoksa oluşturulmaktadır.
public class Logger
{
private readonly FileInfo _file = new FileInfo("app.log");
public void Log(string message)
{
if (!_file.Exists)
using (var created = _file.CreateText())
created.WriteLine("Log dosyası oluşturuldu.");
using (var sw = new StreamWriter(_file.FullName, append: true))
sw.WriteLine($"{DateTime.Now}: {message}");
}
public void ShowLogs()
{
if (_file.Exists)
{
using (var sr = new StreamReader(_file.FullName))
Console.WriteLine(sr.ReadToEnd());
}
else
{
Console.WriteLine("Log dosyası bulunamadı.");
}
}
public void ClearLogs()
{
if (_file.Exists)
_file.Delete();
}
}
class Program
{
static void Main()
{
var logger = new Logger();
logger.Log("Uygulama başladı.");
logger.Log("Bir hata oluştu!");
logger.ShowLogs();
logger.ClearLogs();
}
}
// Örnek çıktı:
// 19.09.2025 12:10:05: Uygulama başladı.
// 19.09.2025 12:10:05: Bir hata oluştu!
TL;DR
File: Statik dosya işlemleri (WriteAllText,ReadAllText,AppendAllText,Exists,Delete).FileInfo: Nesne tabanlı dosya işlemleri (Create,CopyTo,MoveTo,Delete,Exists).StreamReader/StreamWriter: Metin tabanlı okuma/yazma.FileStream: Bayt seviyesinde erişim, büyük dosyalar için uygun.BinaryReader/BinaryWriter: İlkel veri tiplerini binary formatta okuma/yazma.- Stream API, büyük verileri belleğe yüklemeden işleme imkânı sunar.