C# ile Dosyadan Okuma-Yazma İşlemleri!

Finaller, Fuarlar, MSP başvuru videosu derken blogumu yeteri kadar boşladım. (Eğer bu haftada birşeyler yazmasaydım kapatacaktım blogumu :)). Admin paneline girerken tedirgindim ama şifresini hatırlayınca içim rahatladı :).

Yazacağım makalelerin konusunu daha çok forumlardan belirliyorum. Forumlarda en çok hangi konularda problemler ile karşılaşılıyorsa onunla ilgili birşeyler yazmayı tercih ediyorum. Dosyadan okuma yazma işlemleri ile ilgili sorular soruluyordu bende bununla alakalı bir makale yazmak istedim. Umarım faydalı olur…

Dosyadan okuma yazma yapmak için bir tane FileStream türünden nesneye ihtiyacınız olacak.

Örnek olarak; FileStream fs = new FileStream(@”C:\dosya.txt”, FileMode.Create, FileAccess.Read);

İlk parametre hangi dosyadan okuma yapacaksanız veya yazma yapacaksanız dosya yolunu, ikinci parametre ise FileMode türünden bir enum. Bu enum türünden dosyayı ne modda üreteceğinizi veya erişeceğinizi belirtiyorsunuz. FileMode‘da şu değerler var;

FileMode.Append: Eğer dosya başka bir program tarafından kullanılıyorsa veya açıksa
yazacağınız karakterler dosyanın sonuna eklenecek.
FileMode.Create: Belirttiğiniz dosya isminde bir dosya yoksa üretecek, eğer varsa üstüne
yazacak.
FileMode.CreateNew: Dosya olsada olmasada yeni bir tane üretecek.
FileMode.Open: Belirtilen dosyayı açacak. Bu durumda dosyanın kapalı olması lazım
aksi takdirde Exception alabilirsiniz.
FileMode.OpenorCreate: Eğer dosya varsa açacak, yoksa yeni bir tane üretecek.
FileMode.Truncate: Bu modda dosyanın mutlaka açık olması lazım, açık olan dosyanın içindeki
bilgileri siliyor.

FileStream sınıfının üretici fonksiyonun üçüncü parametresi ise, FileAccess türünden bir enum ile dosyaya erişim modunu istiyor. FileAccess’de eğer okuma yapacaksanız .Read, yazma yapacaksanız .Write, hem okuma hem de yazma yapacaksanız .ReadWrite. FileStream’ı tanımladıktan sonra işimiz artık daha da kolay. Bu sınıfın bize sağladı fs.Read(…) ve fs.Write(…) fonksiyonları ile dosyadan veri okuma ve veri yazma yapabiliriz. Şimdi “…” bunları biraz açalım. Önce okuma fonksiyonundan başlayalım;

int [Okunan Byte Sayısı] fs.Read(byte[] dizi, int Indis, int Yazılacak Byte Sayısı): İlk parametre bir byte dizisi dosyadan okuduğunuz verileri bu byte dizisinde olacak, ikinci parametre ise dosyadaki verileri bu dizinin kaçıncı indisinden itibaren yazacağınızı, üçüncü parametre de ise kaç karakter okunacağını istiyor. Geri dönüş değeri ise dosyadan kaç karakter okuduğunuz.

void fs.Write(byte[] dizi, int Indis, int Yazılacak Byte Sayısı): İlk parametre bir byte dizisi dosyaya yazacağınız veriler bu byte dizisinde olacak, ikinci parametre ise dizideki verileri kaçıncı indisinden itibaren yazacağınızı, üçüncü parametre de ise belirtiğiniz indisten itibaren kaç karakter yazacağınızı istiyor.

Dikkatini çektiyse burada hiç string türünden birşey yok, yani siz dosyaya “Deneme yazısı” yazmak istediğinizde bunu bir byte dizisine atmanız gerekiyor. Elbette bu string türünden ifadeyi direk dosyaya yazan bir fonksiyon var ama biz gelin önce bu string’i byte dizisine çevirelim sonra da dosyaya yazalım;

FileStream fs = new FileStream(@"C:\dosya.txt", FileMode.Create, FileAccess.Read);
byte[] dosyaYazisi = ASCIIEncoding.ASCII.GetBytes("Deneme yazısı");
fs.Write(dosyaYazisi, 0, dosyaYazisi.Length);

Evet hepsi bu kadar ama her seferinde yazacağınız veriyi ASCIIEnco…. sınıfında byte’a dönüştürüp sonra yazmak zor olsa gerek. Gelin bunu biz .Write(“Deneme yazısı”) şeklinde yapalım. .Net kütüphanesinde birden fazla okuma ve yazma yapan sınıflar var; StreamWriter, BinaryWriter, StreamReader, BinaryReader gibi sınıflar bu konuda imdadımıza yetişiyor. Bu sınıfların hepsi FileStream türünden bir nesne istiyor, buradan da şunu anlıyoruz biz dosyadan okuma yazma yapacaksak hemen bir tane FileStream tanımlayacağınız. StreamReader ve StreamWriter sınıflarını burada anlatacağım Binary versiyonunu size bırakıyorum :),

StreamWriter sw = new StreamWriter(fs); bu şekilde tanımlama yaptığınız takdirde StreamWriter nesnesini, FileStream türünden tanımladığınız nesnenin tüm özellikleri ile erişebilirsiniz. StreamWriter adından da anlaşılacağı gibi dosyaya yazma yapan bir fonksiyon ve bunun için iki tane kullanışlı fonksiyonu var; .Write(…), .WriteLine(…), WriteLine dediğiniz takdirde “sw.NewLine” özelliğine belirtiğiniz karakteri sonuna ekler. (Hiçbirşey belirtmezseniz ‘\n’ vardır. Yani alt satıra geçer 😉 ).

.Write(…) fonksiyonu neredeyse bütün veri türlerini kabul ediyor ve dosyaya yazıyor. Bu fonksiyonu Console.Write(…) fonksiyonun aynısı olarak düşünebilirsiniz.

StreamReader sınıfını ise tahmin edeceğiniz gibi; StreamReader sr = new StreamReader(fs) şeklinde tanımlıyoruz. StreamReader’da bize dosyadan verileri okumakta yardımcı olan bir sınıf ve kullanışlı olan birkaç .Read fonksiyonu var; .Read(…), .ReadLine(…), .ReadToEnd(…).

.Read(…): Bu fonksiyonun iki türü var eğer .Read() olarak kullanırsanız size int türünden bir değer dönecektir. İkinci türü ise FileStream sınıfındaki .Read(…) ile aynı.

.ReadLine(…): Bu fonksiyon dosyadan sadece tek bir satır okur. Eğer satır satır okuma yapacaksanız bu fonksiyonu kullanabilirsiniz.

.ReadToEnd(…): Bu fonksiyon dosyanın başından sonuna kadar okur ve bunu bir string türünden geri döndürür.

Son olarak şunu da belirtmek istiyorum; FileStream sınıfının önemli bir fonksiyonuda .Seek(…) bu fonksiyonu kullanarak dosya imlecini istediğiniz yere set edebilirsiniz. Kullanımı ise fs.Seek(3, SeekOrigin.Begin) böyle dedikten sonra okuma yaparsanız eğer size (“eme Yazısı”) dönecektir.

Gördüğünüz gibi dosyadan okuma ve yazma işlemi .Net ile çok kolay. Umarım buradaki bilgiler sizlere faydalı olur,

Görüşmek üzere,

Hepinize kolay gelsin, iyi çalışmalar…

Paylaş:
5 Responses to C# ile Dosyadan Okuma-Yazma İşlemleri!
  1. Hidayet

    Merhabalar benim sorum iki sayi arasında randomla sayi oluşturup bunu txt ye yazdım ama geri txt den teker teker okuyarak bir fonksiyon değişkeni olarak tanımlamam lazım bunu nasıl yapabilirim.Kolay gelsin…

  2. cevat

    kardeşim konuyu okudum eline sağlık ancak ben el ile herhangi bir dosya seçip onu okumak istiyorum bu konu hakkında yardımcı olurmusun

  3. Fatih Yorulmaz

    o 50 kaydı listbox’a aktar. listbox’ın birden fazla seçim eventini aç. bir tane combobox ile de textboxların seçimini yap. kod satırında bir tane dizi değişken ata içerisini listboxlarda seçili olan isimlerle doldur. for döngüsü ile dizini 10 defa döndür bu sayede txt ye yazdırılacak dosyayı hazır etmiş olursun. txt dosya yolunuda combobox dan al.

  4. MERVE

    Merhaba,
    Öncelikle paylaşımlarınız için teşekkürler. Ben şöyle bir şey arıyorum. Benim bir tablomda 50 tane kaydım var ve 5 tane ayrı txt dosyasında yazılarım var. Şimde ben 10 tane kaydı seçip, 1 tane txt dosyasını seçtikten sonra yazdır dediğimde aynı txt dosyasının içine işte ad soyad vb. özellikleri ekleyip 10 tane ayrı çıktı almak istiyorum. Biraz karışık ama yardımcı olursanız sevinirim. Bir çok şey geliyo aklıma ama işte ad soyad a değişken tanımlayıp onları döngüyle çağırmak gibi. ama çıkmaza girdim. Şimdiden teşekkürler

  5. Kod

    Merhaba, paylaşım için teşekkürler. BinaryWrite ile Write(byte dizi, int indis(adres),int uzunluk) şeklinde bir yapı oluşturup bunu nasıl yazıp okuyabiliriz. Bununla ilgili daha detay açıklama yapabilir misniz?

Bir Cevap Yazın

Your email address will not be published. Please enter your name, email and a comment.