Dosya I/O
Dosya I/O (Input/Output) C#’ta verilerin dosyalardan okunması ve dosyalara yazılması işlemlerini ifade eder. Modern yazılım geliştirme süreçlerinde, kullanıcı verilerini saklamak, uygulama günlüklerini (logs) tutmak, konfigürasyon dosyalarını yönetmek veya büyük veri setlerini işlemek için dosya I/O işlemleri kritik öneme sahiptir. System.IO isim alanı, File, FileInfo, StreamReader, StreamWriter ve FileStream gibi sınıfları ile güvenli ve verimli dosya işlemleri sağlar.
C#’ta Dosya I/O, özellikle kalıcı veri yönetimi gerektiren projelerde, algoritma optimizasyonu ve veri yapıları kullanımıyla birlikte programcıya büyük avantajlar sağlar. OOP prensiplerini kullanarak, dosya yönetimini modüler ve bakımı kolay hale getirmek mümkündür. Bu eğitimde, okuyucu dosya oluşturmayı, okuma ve yazma işlemlerini, hata yönetimini ve performans optimizasyonlarını öğrenecek. Aynı zamanda dosya I/O’nun yazılım mimarisindeki yeri ve projelerde nasıl etkili kullanılacağı detaylı olarak açıklanacak.
Temel Örnek
textusing System;
using System.IO;
class BasicFileIO
{
static void Main()
{
string filePath = "ornek.txt";
// Dosyaya yazma
try
{
using (StreamWriter writer = new StreamWriter(filePath))
{
writer.WriteLine("Merhaba C#!");
writer.WriteLine("Bu temel bir Dosya I/O örneğidir.");
}
Console.WriteLine("Dosya başarıyla yazıldı.");
}
catch (IOException ex)
{
Console.WriteLine($"I/O hatası: {ex.Message}");
}
// Dosyayı okuma
try
{
using (StreamReader reader = new StreamReader(filePath))
{
string content = reader.ReadToEnd();
Console.WriteLine("Dosya içeriği:");
Console.WriteLine(content);
}
}
catch (IOException ex)
{
Console.WriteLine($"I/O hatası: {ex.Message}");
}
}
}
Yukarıdaki örnekte StreamWriter ile dosyaya yazma ve StreamReader ile okuma işlemleri yapılmıştır. filePath değişkeni dosyanın yolunu belirtir. using bloğu, kaynakların otomatik olarak serbest bırakılmasını sağlar ve olası bellek sızıntılarını veya dosya kilitlenmelerini önler.
try-catch blokları, giriş/çıkış hatalarının yönetilmesini sağlayarak uygulamanın güvenilirliğini artırır. ReadToEnd() metodu, dosya içeriğini tamamen okur ve loglama, konfigürasyon dosyası okuma veya veri analizi gibi senaryolarda pratik bir çözüm sunar. Bu örnek, C# dilinde doğru sözdizimi, kaynak yönetimi ve OOP prensiplerini bir arada gösterir.
Pratik Örnek
textusing System;
using System.IO;
class AdvancedFileIO
{
static void Main()
{
string filePath = "veriler.txt";
// Dosyanın varlığını kontrol etme
if (!File.Exists(filePath))
{
File.Create(filePath).Dispose();
}
// Çoklu satır yazma
string[] lines = { "Kullanıcı1,25,Geliştirici", "Kullanıcı2,30,Yönetici", "Kullanıcı3,22,Stajyer" };
try
{
File.WriteAllLines(filePath, lines);
Console.WriteLine("Veriler başarıyla yazıldı.");
}
catch (IOException ex)
{
Console.WriteLine($"Yazma hatası: {ex.Message}");
}
// Dosyayı okuma ve verileri işleme
try
{
string[] readLines = File.ReadAllLines(filePath);
foreach (string line in readLines)
{
string[] parts = line.Split(',');
string name = parts[0].Trim();
int age = int.Parse(parts[1]);
string role = parts[2].Trim();
Console.WriteLine($"İsim: {name}, Yaş: {age}, Rol: {role}");
}
}
catch (IOException ex)
{
Console.WriteLine($"Okuma hatası: {ex.Message}");
}
catch (FormatException ex)
{
Console.WriteLine($"Format hatası: {ex.Message}");
}
}
}
Bu pratik örnek, CSV benzeri dosyaların okunması ve işlenmesini göstermektedir. File.Exists dosyanın varlığını kontrol eder, File.Create gerekirse dosya oluşturur. File.WriteAllLines ve File.ReadAllLines ile tüm satırlar yazılır ve okunur. Split() ve int.Parse() ile veriler ayrıştırılır ve işlenir.
Hata yönetimi ile FormatException ve IOException yakalanarak uygulamanın güvenilirliği artırılır. Bu örnek, C#’ta kaynak yönetimi, OOP prensipleri ve okunabilir kod yazma konusunda ileri seviye bir uygulamadır.
C# Dosya I/O için en iyi uygulamalar arasında using bloklarının kullanımı, dosya boyutu büyük ise buffering uygulaması ve doğru exception yönetimi yer alır. Yaygın hatalar arasında stream’leri açık bırakmak, kaynakları serbest bırakmamak ve verimsiz algoritmalar kullanmak bulunur.
Debug sürecinde dosya yollarını, izinleri ve veri bütünlüğünü kontrol etmek önemlidir. Güvenlik açısından dosya erişim izinleri, directory traversal önlemleri ve hassas dosyaların korunması önemlidir. Performans için uygun veri yapıları, buffering ve çoklu iş parçacığı (multithreading) kontrolleri önerilir.
📊 Referans Tablosu
C# Element/Concept | Description | Usage Example |
---|---|---|
File.Exists | Dosyanın var olup olmadığını kontrol eder | if (File.Exists("dosya.txt")) Console.WriteLine("Var"); |
File.Create | Yeni dosya oluşturur ve FileStream döner | File.Create("yeni.txt").Dispose(); |
StreamWriter | Dosyaya yazı yazmayı sağlar | using (StreamWriter sw = new StreamWriter("log.txt")) { sw\.WriteLine("Yeni satır"); } |
StreamReader | Dosyadan yazı okumayı sağlar | using (StreamReader sr = new StreamReader("log.txt")) { string content = sr.ReadToEnd(); } |
File.ReadAllLines | Tüm satırları string dizisine okur | string\[] lines = File.ReadAllLines("veriler.txt"); |
File.WriteAllLines | String dizisini dosyaya yazar | File.WriteAllLines("veriler.txt", lines); |
Dosya I/O C#’ta veri yönetimi ve işleme için temel bir konudur. File, StreamReader ve StreamWriter sınıfları ile güvenli ve etkili dosya işlemleri gerçekleştirilebilir.
Bir sonraki adımlar arasında async/await ile dosya işlemleri, ikili dosya yönetimi ve dosya işlemlerini veritabanı veya ağ stream’leriyle entegre etmek bulunur. Unit testler ile dosya I/O işlemlerinin doğrulanması ve büyük dosyalarda performans analizi, ileri seviye yetkinlik kazandırır. Microsoft dokümantasyonu ve geliştirici toplulukları ile sürekli öğrenme tavsiye edilir.
🧠 Bilginizi Test Edin
Test Your Knowledge
Test your understanding of this topic with practical questions.
📝 Talimatlar
- Her soruyu dikkatle okuyun
- Her soru için en iyi cevabı seçin
- Quiz'i istediğiniz kadar tekrar alabilirsiniz
- İlerlemeniz üstte gösterilecek