File I/O Hatasını Çözmek: Encoding ve Lock Sorunları

Dosya okuma-yazma işlemlerinde en sık karşılaşılan iki sorun var: yanlış karakter kodlaması (encoding) ve başka bir proses tarafından kilitlenmiş dosya. İkisi de uygulamayı çökertir ama ikisinin de çözümü basit.

Encoding sorunu genellikle Türkçe karakterler (ç, ğ, ı, ö, ş, ü) okurken ortaya çıkar. Dosya UTF-8 ile kaydedilmişse ama UTF-8 belirtmeden okursan, karakterler bozuk görünür. File lock ise dosyayı açık tutan başka bir program (Excel, Word, başka bir uygulama örneği) varsa oluşur.

1using System;
2using System.IO;
3using System.Text;
4using System.Threading;
5
6class FileIODemo
7{
8static void Main()
9{
10string filePath = "test.txt";
11string content = "Merhaba dünya! Çok güzel.";
12
13// Doğru yazma: UTF-8 ile
14try
15{
16File.WriteAllText(filePath, content, Encoding.UTF8);
17Console.WriteLine("Dosya yazıldı.");
18}
19catch (IOException ex)
20{
21Console.WriteLine($"Yazma hatası: {ex.Message}");
22}
23
24// Doğru okuma: UTF-8 ile
25try
26{
27string readContent = File.ReadAllText(filePath, Encoding.UTF8);
28Console.WriteLine($"Okunan: {readContent}");
29}
30catch (IOException ex)
31{
32Console.WriteLine($"Okuma hatası: {ex.Message}");
33}
34
35// File lock sorununu çözmek: retry mekanizması
36RetryFileOperation(() =>
37{
38using (var stream = new FileStream(filePath, FileMode.Open, FileAccess.Read, FileShare.Read))
39using (var reader = new StreamReader(stream, Encoding.UTF8))
40{
41Console.WriteLine($"Başarıyla okundu: {reader.ReadToEnd()}");
42}
43}, maxRetries: 3);
44}
45
46static void RetryFileOperation(Action operation, int maxRetries = 3, int delayMs = 500)
47{
48for (int i = 0; i < maxRetries; i++)
49{
50try
51{
52operation();
53return;
54}
55catch (IOException) when (i < maxRetries - 1)
56{
57Console.WriteLine($"Deneme {i + 1} başarısız, {delayMs}ms sonra yeniden deneniyor...");
58Thread.Sleep(delayMs);
59}
60}
61}
62}

Beklenen çıktı:

Reklam · TEST
AdSense Test ReklamıYazı arası (gönderi içi) · Yazı arası
1Dosya yazıldı.
2Okunan: Merhaba dünya! Çok güzel.
3Başarıyla okundu: Merhaba dünya! Çok güzel.

Kod açıklaması: Encoding.UTF8 parametresi yazma ve okumada zorunlu. Dosya kilitlenirse, RetryFileOperation metodu belirli aralıklarla yeniden deneme yapar. FileShare.Read kullanarak başka proseslerin de dosyayı okumasına izin verirsin.

Sık yapılan hata: Encoding belirtmeden okuma yapmak. Varsayılan sistem kodlaması (genellikle ANSI) Türkçe karakterleri bozar. Daima UTF-8 belirt ya da dosyanın kaydedildiği encoding'i öğren.

Reklam · TEST
AdSense Test ReklamıGönderi altı · Görüntülü
konu hakkında tepkinizi verebilirsiniz
  • ordinarybiri

    encoding sorunuyla uğraşmak gerçekten can sıkıcı özellikle Türkçe dosyalarla

  • adlı kullanıcıya yanıt verdi
    sonbahargibi

    ya ben de Excelden CSV indirip okumaya çalışırken çıldırdım karakterler salak salak görünüyordu sonra UTF 8 yazmayı unuttuğümü fark ettim

  • adlı kullanıcıya yanıt verdi
    ordinarybiri

    Excel o kadar tuzak dolu ki ya Bir de dosyayı kapatmayı unutunca lock hatası alıyorsun sonra ne oldu diye takılıp kalıyorsun

  • adlı kullanıcıya yanıt verdi
    sonbahargibi

    dosya kapalı değilse hata vermesi de çok sinir bozucu bir de başka bir tabta açıksa anlamazsın neden kitli diye

  • adlı kullanıcıya yanıt verdi
    ordinarybiri

    işte ya bir de bilgisayarı restart etmek zorunda kalıyorsun bazen dosya hala kilitli diye niye Excel böyle yapıyor anlamıyorum