C# Dosyaya Veri Yazma

Merhabalar, C# derslerimize kaldığımız yerden devam ediyoruz. Bu dersimizde dosyaya veri yazma işlemlerini anlatacağım. Hazırsak başlayalım !
Öncelikle dosya.txt isminde masaüstünde bir tane metin belgesi oluşturalım, tüm işlemleri bu dosya üzerinden yürüteceğiz. Dosyamızın yolu ise c:/users/kullanici/desktop/dosya.txt olsun ve bu yolu da bir değişkene atayalım. Yani
string dosya = c:/users/kullanici/desktop/dosya.txt
Dosyaya veri yazmanın iki yolu var. Birincisi dosyanın başka bir kullanıcı yada thread tarafından kullanılmadığından eminsek File classının WriteText static fonksiyonunu kullanabiliriz. Bu metod ise ilki dosya yolu ve ikincisi yazılacak ifade olmak üzere 2 parametre alıyor ve örnek kullanımı şu şekilde;
File.WriteText(dosya, "ilk dosyaya veri yazma denemesi");
Bu fonksiyon dosyayı açıp yazmayı tamamladıktan sonra dosyayı kapattığı için bizim bi daha dosyayı kapatmamıza gerek yok. WriteText() metodu dosyaya veriyi yazdıktan sonra imleci verinin sonuna getirir ve dosyaya ekleme yapmak istediğimizde ilk yazılan verinin bittiği yerden devam eder, yani yeni bir satıra geçmez. Eğer veriyi yazıp sonrada bir enter aşağı geçsin yani imleç bir sonraki satıra geçsin derseniz WriteText() yerine WriteLine() metodunu kullanmamız gerek. WriteLine() metodu da WriteText() gibi dosya yolu ve yazılacak veri olmak üzere 2 parametre alıyor, kullanımı aynı yani. Buna bir örnekte şöyle verelim;
File.WriteLine(dosya, "ilk yazma denemesi");
E biz hep tek satır yazdık, bunun çoklu olanı yok mu, ben tek seferde 10 satır yazamaz mıyım diye sorabilirsiniz. Cevap evet, tek seferde istediğiniz kadar satır yazabilirsiniz ama bunun için de WriteAllText() ve WriteAllLines() fonksiyonlarını kullanmanız gerek. Bu fonksiyonların her ikiside parametre olarak dizi istiyor ve aralarındaki fark WriteText() ile WriteLine() ile aynı. Yani WriteAllText() her veride yeni satıra geçmez, kaldığı yerden devam ederken, WriteAllLines() metodu her veride bir sonraki satıra geçer. Aslında WriteAllText() metodu WriteText() metodunun, WriteAllLines() ise WriteLine() metodunun çoğul halidir ve arka planda foreach döngüsü koşar. Yani örneğin WriteAllLines() metodu
foreach(var item in dizi)
File.WriteLine(item);
şeklinde bir kod yapısına sahiptir.
Dosyaya yazmanın iki yolu var dedik ve birinci yolu açıkladık, şimdi ikinci yola geçelim;
WriteText() ve WriteLine() metodları dosya ile işi bitince dosyayı kapatıyor dedik ama aynı dosyayı o anda başka bir işlem kullanıyorsa bu sorun olacaktır, çünkü aynı anda aynı dosyayı iki işlem birden kullanamaz demiştik. Şimdi buna da bir çözüm bulalım ve başka bir işlem o dosyayı kullanıyorsa onun işini bitirmesini bekleyip sonrada biz geçelim. Bunun için de “dosya okuyucusu” gibi çevirebileceğimiz bir özelliği yani Stream kullanalım. Tabi işin içinde dosya olduğu için kullanacağımız yapının adı FileStream olacaktır. FileStream static olmayan bir classtır ve yeni bir nesnesini türetmemiz gerek. FileStream sadece dosyayı açmamıza yarayacak, asıl yazma işlemini de StreamWriter adı verilen yapı yapacak. StreamWriter’da static olmayan bi class olduğu için onun da yeni bir nesnesini türetmemiz gerekiyor. Zaten StreamWriter, parametre olarak FileStream istediği için her ikisinin de yeni bir nesnesini türetmemiz gerekecek. FileStream ise dosya yolu, dosya açma türü ve yapılacak işlem olmak üzere 3 parametre istiyor. Dosya açma türünden kastım dosyaya veri mi yazacağız, dosyadan veri mi okuyacağız yoksa veri mi ekleyeceğiz bunu belirtmemiz gerek. Yapılacak işlem olarak da dosya açılacak mı, oluşturulacak mı onu belirtmeliyiz. Tabi biz dosyaya yazmak için açacağız. Hadi kodunu yazalım;
FileStream fs = new FileStream(dosya, FileAccess.Write, FileMode.Open);
StreamWriter writer = new StreamWriter(fs);
E dosyayı yazmak için açtık ama nasıl yazacağız derseniz de;
writer.Write("Stream kullanarak dosyaya veri yazma örneği");
FileStream oluştururken dosya yolunu belirttiğimiz için Write() fonksiyonunda dosya yolunu tekrardan bildirmemize gerek yok.
Evet dosyayı açtık ve yazdık ama dosya açık kaldı, e onu da kapatmamız gerek. Fakat dikkat ederseniz hem dosyayı açan hemde yazan nesneler açık, her ikisini de kapatmamız gerek. Hadi kapatalım;
fs.Close();
writer.Close();
Evet işlemlerimiz bu kadar, dosyaya veri yazma işlemini başarılı bir şekilde yaptık. Kodun tam hali için;
FileStream fs = new FileStream(dosya, FileAccess.Write, FileMode.Open);
StreamWriter writer = new StreamWriter(fs);
writer.Write("Stream kullanarak dosyaya veri yazma örneği");
fs.Close();
writer.Close();
Bu dersimizde bu kadardı, diğer C# ile dosya işlemleri derslerimize ulaşmak için buraya, Tüm C# derslerimize ulaşmak için ise buraya tıklayabilirsiniz. Herkese hayırlı günler.