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;56class FileIODemo7{8static void Main()9{10string filePath = "test.txt";11string content = "Merhaba dünya! Çok güzel.";1213// Doğru yazma: UTF-8 ile14try15{16File.WriteAllText(filePath, content, Encoding.UTF8);17Console.WriteLine("Dosya yazıldı.");18}19catch (IOException ex)20{21Console.WriteLine($"Yazma hatası: {ex.Message}");22}2324// Doğru okuma: UTF-8 ile25try26{27string readContent = File.ReadAllText(filePath, Encoding.UTF8);28Console.WriteLine($"Okunan: {readContent}");29}30catch (IOException ex)31{32Console.WriteLine($"Okuma hatası: {ex.Message}");33}3435// 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}4546static void RetryFileOperation(Action operation, int maxRetries = 3, int delayMs = 500)47{48for (int i = 0; i < maxRetries; i++)49{50try51{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ı:
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.
5 yorum
encoding sorunuyla uğraşmak gerçekten can sıkıcı özellikle Türkçe dosyalarla
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
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
dosya kapalı değilse hata vermesi de çok sinir bozucu bir de başka bir tabta açıksa anlamazsın neden kitli diye
işte ya bir de bilgisayarı restart etmek zorunda kalıyorsun bazen dosya hala kilitli diye niye Excel böyle yapıyor anlamıyorum