C# programlama dili, dosya işlemleri için güçlü ve esnek yöntemler sunar. Sistem dosyalarına erişim, veri okuma ve yazma işlemleri hem temel seviyede hem de yüksek seviyede kolaylıkla yapılabilmektedir. Bu makalede, C# kullanarak dosya okuma ve yazma işlemlerinin nasıl yapıldığı detaylı olarak ele alınacaktır.

Dosya İşlemlerine Giriş

Dosya işlemleri, bir uygulamanın verileri kalıcı olarak saklamasını ve bu verilere daha sonra erişmesini sağlar. C# dilinde dosya işlemleri genellikle System.IO namespace’i kullanılarak gerçekleştirilir. Bu namespace içerisinde bulunan File, FileInfo, StreamReader, StreamWriter gibi sınıflar, dosya okuma ve yazma süreçlerini kolaylaştırır.

File Sınıfı ile Basit Dosya İşlemleri

File sınıfı, dosya işlemleri için en basit ve hızlı yolu sunar. Bu sınıf sayesinde bir dosyanın tamamını okuyabilir veya yazabilirsiniz. Örneğin, bir metin dosyasının içeriğini okumak için File.ReadAllText() metodu kullanılabilir:

string content = File.ReadAllText("ornek.txt");

Aynı şekilde, bir dosyaya veri yazmak için File.WriteAllText() metodu kullanılabilir:

File.WriteAllText("ornek.txt", "Merhaba Dünya!");

Bu yöntemler, küçük boyutlu dosyalar için oldukça etkili olsa da büyük dosyalar için bellek sorunlarına neden olabilir. Bu nedenle büyük dosyalarla çalışırken daha gelişmiş yöntemler tercih edilmelidir.

StreamReader ve StreamWriter Kullanımı

StreamReader ve StreamWriter sınıfları, dosya işlemlerinde daha fazla kontrol ve performans sağlar. Özellikle büyük metin dosyalarında veri satır satır okunabilir ya da yazılabilir. Bu sınıflar, veri akışlarını yöneterek bellek kullanımını optimize eder.

Aşağıdaki örnek, bir dosyayı satır satır okumayı göstermektedir:


using (StreamReader reader = new StreamReader("ornek.txt"))
{
    string line;
    while ((line = reader.ReadLine()) != null)
    {
        Console.WriteLine(line);
    }
}
    

Benzer şekilde, StreamWriter kullanarak satır satır veri yazılabilir:


using (StreamWriter writer = new StreamWriter("ornek.txt"))
{
    writer.WriteLine("İlk satır");
    writer.WriteLine("İkinci satır");
}
    

using bloğu, kaynakların doğru şekilde serbest bırakılmasını sağlar. Bu yapı, dosya işlemlerinde hata yönetimi açısından da oldukça güvenlidir.

FileInfo ve DirectoryInfo Sınıfları

FileInfo ve DirectoryInfo sınıfları, dosya ve dizinlerle ilgili daha detaylı bilgi almak veya işlem yapmak için nesne yönelimli bir yaklaşım sunar. FileInfo nesnesi oluşturularak dosya üzerinde çeşitli işlemler yapılabilir:


FileInfo fileInfo = new FileInfo("ornek.txt");
if (fileInfo.Exists)
{
    Console.WriteLine($"Dosya boyutu: {fileInfo.Length} byte");
}
    

Benzer şekilde, DirectoryInfo ile dizin işlemleri yönetilebilir. Bu sınıflar, dosya ve dizinlerin oluşturulması, silinmesi, taşınması gibi işlemleri de destekler.

İkili Dosya İşlemleri

C# ile yalnızca metin dosyaları değil, ikili (binary) dosyalar da okunabilir ve yazılabilir. FileStream sınıfı, bu tür işlemler için kullanılır. Özellikle resim, ses veya video gibi dosyaların işlenmesi sırasında FileStream tercih edilir.

Aşağıdaki örnek, bir ikili dosyanın okunmasını ve başka bir dosyaya yazılmasını göstermektedir:


using (FileStream inputStream = new FileStream("giris.jpg", FileMode.Open, FileAccess.Read))
using (FileStream outputStream = new FileStream("cikis.jpg", FileMode.Create, FileAccess.Write))
{
    byte[] buffer = new byte[1024];
    int bytesRead;
    while ((bytesRead = inputStream.Read(buffer, 0, buffer.Length)) > 0)
    {
        outputStream.Write(buffer, 0, bytesRead);
    }
}
    

Bu örnekte, dosya içeriği 1024 byte’lık parçalar halinde okunup yazılır. Bu yöntem, büyük dosyaların işlenmesinde verimliliği artırır.

Hata Yönetimi ve Güvenlik

Dosya işlemleri sırasında oluşabilecek hatalar için uygun istisna yönetimi yapılmalıdır. FileNotFoundException, DirectoryNotFoundException, UnauthorizedAccessException gibi özel istisnalar ile hata durumları yönetilebilir.


try
{
    string content = File.ReadAllText("varolmayan.txt");
}
catch (FileNotFoundException)
{
    Console.WriteLine("Dosya bulunamadı.");
}
catch (UnauthorizedAccessException)
{
    Console.WriteLine("Dosyaya erişim izniniz yok.");
}
    

Ayrıca, kullanıcı girdilerinden gelen dosya yolları doğrulanmalı ve dosya işlemlerinde güvenlik açıklarına karşı önlem alınmalıdır. Güvensiz dosya yolları, uygulama içinde beklenmedik erişimlerin yapılmasına neden olabilir.

Performans ve En İyi Uygulamalar

Dosya işlemlerinde performansı artırmak için bazı en iyi uygulamalar vardır. Öncelikle, using blokları ile kaynakların doğru şekilde serbest bırakılması gerekir. Ayrıca, büyük dosyaları tek seferde okumak yerine parça parça işlemek daha verimlidir.

Gereksiz dosya erişimlerinden kaçınılmalı, işlemler önbelleğe alınabiliyorsa bu yöntemler tercih edilmelidir. Dosya işlemleri sırasında asenkron metotlar (ReadAllTextAsync, WriteAllTextAsync) kullanmak da performansı artırabilir.

Sonuç

C# dilinde dosya okuma ve yazma işlemleri, uygulamaların veri yönetimi açısından esnekliğini artırır. System.IO kütüphanesindeki sınıflar sayesinde hem metin hem de ikili dosyalar üzerinde güvenli ve verimli işlemler yapılabilir. Doğru hata yönetimi ve performans optimizasyonu ile dosya işlemleri uygulamaların daha sağlam çalışmasını sağlar.

Bir önceki yazımız olan Print Screen Engelleme başlıklı makalemizde Engelleme, İşletim Sistemi ve key logger hakkında bilgiler verilmektedir.