Visual Basic’de Sıralı ve Rasgele dosyalar olmak uzere iki tur dosya vardır. Dosyalar en basit ifadesi ile verileri disk uzerinden (hard disk veya disket) işlemek amacıyla kullanılırlar ve bu yonu ile diğer veri saklama ve işleme yontemlerinden ayrılırlar. Herhangibir veriyi VB’de kullanmak icin birkac yol vardır; ya ilgili veri bir değişkene eşitlenir (a=5 veya b=”Mehmet” gibi) ki bu durumda ilgili değişkenin değerini değiştirmek icin sozkonusu satıra programcının bizzat mudahalesi gerekir veya ilgili veri dizi değişkenlerine aktarılır (t(2)=13 veya gh=”Ders” gibi). Verinin dizi değişkenlerine aktarılması durumunda değişken değerleri gecici hafızaya kaydedileceğinden programdan cıkıldığında sozkonusu veriler yok olacaktır. Bu nedenle dosyalar verileri saklamak, oluşturulmuş olan dosyaya ilaveler yapmak ve yanlış verileri duzeltmek konusunda yukarıda anlatılan yontemlere gore cok avantajlıdır.
Sıralı dosyalarda herbir kayıt, adından da anlaşılacağı gibi, disk uzerine birbiri ardında sıralı olarak kaydedilmektedir. Sozkonusu kayıtlara ancak mevcut kayıtlar sırasıyla okunmak suretiyle erişilebilmektedir. O halde, belirli bir kaydı bulabilmek icin ondan oncekilerin tumunu okumak gerekmektedir.
Rasgele dosyalar, sıralı dosyalardan farklı bir yapıya sahiptir. Belirli bir kayıta, kayıt numarsını vermek suretiyle doğrudan doğruya erişilebilir.
Bir dosyanın icindeki tum kayıtların işlem gormesi gerekiyorsa, dosyanın sıralı olarak oluşturulması, buna karşın sadece belirli kayıtlara erişim sozkonusu ise rasgele olarak oluşturulması daha uygun olacaktır.
Sıralı dosyalar programcılık acısından daha kolay, buna karşın işlem zamanı acısından bilgisayara vakit kaybettirirler. Rasgele dosyalar programcılık acısından sıralı dosyalara gore daha zor ama veri uzerindeki işlemlerin cabukluğu acısından avantajlıdır.
Sıralı Dosyalar
Dosyanın Acılması
Sıralı bir dosyayı acmak icin FileOpen komutundan faydalanılır. Bu komutun genel kullanılış bicimi aşağıdaki gibidir:
FileOpen (Dosya numarası, Dosya ismi, Dosyanın acılış bicimi)
Sıralı bir dosya uc değişik şekilde acılabilir:
· OpenMode.Output: Dosyayı ilk defa oluşturmak ve ilk bilgileri aktarmak amacıyla
İlk defa oluşturulan ve icine ilk bilgilerin girildiği dosya aynı isimde tekrar Output şeklinde acılırsa, dosyanın icindeki bilgilerin tamamı yok olur.
· OpenMode.Append: Daha once oluşturulmuş olan dosyaya ilave bilgilerin aktarılması amacıyla.
· OpenMode.Input: Dosyanın icindeki bilgilerin okunması amacıyla.
Dosya numarası 1 ile 255 (1 ve 255 dÂhildir) arasında bir tamsayı olmalıdır.
Dosya adı yol ismi verilerek tanımlanabileceği gibi, yol ismi verilmeden de tanımlanabilir. Dosya ismi yol ismi verilmeden tanımlanırsa ilgili dosyanın, programın calıştırıldığı klasorde olduğu varsayılır. Dosya ismi yol ismi verilerek tanımlanırsa, dosyanın ilgili yola gore ilgili klasorde olduğu varsayılır.
Ornekler
FileOpen(157, "Personel", OpenMode.Output)
Personel isimli ve 157 numaralı dosya, icine ilk defa bilgi girilmek uzere acılmaktadır. Personel isimli dosya, programın calıştırıldığı klasorde bilgisayar tarafından oluşturulacaktır (acılacaktır).
FileOpen(3, "c:\abc\Bilgi.txt", OpenMode.Append)
Bilgi.txt isimli dosya, hard diskin (C’de) abc isimli klasorunde, icine ilave bilgiler yazılmak uzere acılmaktadır
OpenMode.Append acılış şekli iki şekilde kullanılabilir;
1- Bilgi.txt isimli dosya daha once oluşturulmamışsa, bu satır ile bu dosya oluşturulur (OpenMode.Output gibi kullanılabiliyor),
2- Bilgi.txt isimli dosya daha once oluşturulmuş ise, bu satır ile dosyanın icindeki verilere ilave veriler oluşturulmak uzere acılır (OpenMode.Append).
FileOpen(2, "deneme", OpenMode.Input)
Deneme isimli dosya, icindeki bilgilerin okunması amacıyla acılmaktadır. Deneme isimli dosyanın onunde yol ismi verilmediğinden, sozkonusu dosya programın calıştığı klasorde bulunmak zorundadır.
Acılmış Olan Dosyanın Kapatılması
Yukarıda anlatılan uc değişik şekilden herhangibirisiyle acılan bir dosya FileClose () komutu kullanılarak kapatılır. Genel Kullanılışı:
FileClose (Dosya Numarası1, Dosya Numarası2, Dosya Numarası3, .......)
FileClose () komutu, bu şekilde dosya numarası vermeden kendi başına da kullanılabilir. Bu durumda acık olan tum dosyalar kapatılır.
Ornekler
FileClose (1) 1 numaralı dosyayı kapat
FileClose (5,7,8) 5,7 ve 8 numaralı dosyaları kapat
FileClose () Acık olan butun dosyaları kapat
Dosya - Dizin İsimlerinin/Uzantılarının Değiştirilmesi
Bunun icin Rename() komutundan faydalanılır. Genel kullanılışı
Rename (dosyanın eski ismi, dosyanın yeni ismi)
Ornekler
Rename ("Hedef.txt", "Personel.txt")
Hedef.txt isimli dosya ismi Personel.txt olarak değiştiriliyor.
Rename ("Ders.gty","Kurs.hue")
Ders.gty dosya ismi Kurs.hue şeklinde değiştiriliyor.
Dosyaların Silinmesi
Bu işlem Kill() komutu ile gercekleştirilir.
Kill ("Silinecek Dosya İsmi")
Ornekler
Kill ("deneme")
deneme isimli dosya silinmek isteniyor
Kill ("c:\gate\maden.kes")
Hard diskin gate klasorundeki maden.kes isimli dosya silinmek isteniyor.
Kill ("d:\*.txt")
D’nin ana bolgesindeki, uzantısı txt olan butun dosyalar silinmek isteniyor.
Kill komutu ile silinmek istenen dosyanın oncelikle Fileclose() komutu ile kapatılması gerekir, aksi halde bilgisayar acık olan dosyanın kapatılması isteği karşısında hata hesajı verir ve programı calıştırmaz.
Sıralı Dosyaya Yazma İşlemi
Bu işlem icin kullanılan komutlardan ikisi Write (), WriteLine () komutlarıdır.
Write (dosya numarası, değişken1, değişken2,… )
WriteLine (dosya numarası, değişken1, değişken2,… )
Her iki komutun da kullanım şekli aynıdır, fakat iki komutun sonucları farklıdır. Write komutu, dosyaya yazılacak ifade veya hafızadaki değişkenlerin karşılıklarını ayrı satırlara değilde, peşpeşe yazar. Buna karşın WriteLine komutu, dosyaya yazılacak ifade veya hafızadaki değişkenlerin karşılıklarını ayrı satırlara yazar. Bundan dolayı WriteLine komutu, Write komutuna gore okunabilirlik ve programlanabilirlik acısından daha kullanışlıdır ve daha cok tercih edilmektedir.
Ornekler
Aşağıda aynı programın Write ve WriteLine komutları ile yazılmış halini ve sonucta verilerin yazıldığı dosyanın iceriği gorulmektedir. Program; 1’den 4’e kadar olan sayıların ve “SAU” ifadesinin, deneme isimli dosyaya yazdırılması ile ilgilidir.
Private Sub Form1_Load()
Dim h As Byte
FileOpen(7,"c:\deneme",OpenMode.Output)
For h = 1 To 4
Write(7, h, "SAU")
Next
FileClose()
End Sub
Deneme isimli dosyanın iceriği
1,"SAU",2,"SAU",3,"SAU",4,"SAU",
Private Sub Form1_Load()
Dim h As Byte
FileOpen(7,"c:\deneme",OpenMode.Output)
For h = 1 To 4
WriteLine(7, h, "SAU")
Next
FileClose()
End Sub
Deneme isimli dosyanın iceriği
1,"SAU"
2,"SAU"
3,"SAU"
4,"SAU"
Write (8, a,isim,yas)
8 numaralı dosyaya sırasıyla; a değişkeninin, isim değişkeninin ve yas değişkeninin hafızadaki karşılıkları yan yana yazdırılıyor.
WriteLine (34, "Sakarya",56.2,u)
34 numaralı dosyaya sırasıyla; Sakarya ifadesi, 56.2 sayısı ve u değişkeninin hafızadaki karşılığı, ayrı satırlarda yazdırılıyor.
Write/WriteLine komutunda kullanılan dosya numarası, FileOpen komut satırında kullanılan dosya numarası ile aynı olmalıdır.
Sıralı Dosyadan Okuma İşlemi
Bu işlem Input () komutu ile gercekleştirilir.
Input (dosya numarası, değişken)
Ornekler
Input (34, isim)
34 numaralı dosyadan, sıradaki değer (veya ifade) okunup, hafızada isim değişkeninin karşılığı olarak atanır.
Input (7, nt)
7 numaralı dosyadan, sıradaki değer veya (muhtemelen) sayı okunup, hafızada nt değişkeninin karşılığı olarak atanır.
Input komutu, sadece ilgili dosyadan bir adet değişken okur. Input (5,a,b) orneğinde olduğu gibi aynı anda hem a ve hem de b değişkenini okuyamaz, boyle durumda hata mesajı ile karşılaşılır. Ornek olarak gosterilen bu satırın herbir değişken icin ayrı ayrı ve şu şekilde kullanılması gerekir:
Input (5,a)
Input (5,b)
Input komutunda kullanılan dosya numarası, FileOpen komut satırında kullanılan dosya numarası ile aynı olmalıdır.
Kayıt sonuna gelinip gelinmediğinin kontrol ettirilmesi
Dosyadan bilgi okuma sırasında gerekli olan komutlardan birisi de; okuma işlemi icin acılmış olan dosyadaki kayıtların sonuna gelinip gelinmediğini kontrol amacıyla kullanılan EOF () (End Of File – Dosya Sonu) komutudur. Bu komut ozellikle icindeki bilgilerin okunacağı dosyada kac adet kayıt olduğunun bilinmediği durumlarda kullanılır ve her kayıt okunmadan once kayıt sonuna gelinip gelinmediğinin kontrol ettirilmesi amacıyla kullanılır. Boylece bilgisayar olmayan bir kaydı okuma işlemine girişmemiş olacaktır (boyle bir durum programın hata mesajı vermesine ve dolayısıyla kesilmesine neden olur). EOF() komutunun genel kullanılış bicimi aşağıdaki gibidir:
EOF (dosya numarası)
EOF komutu dosya sonunda True (doğru) aksi halde (bu durumda okunacak başka kayıt var demektir) False (yanlış) sonucunu verir.
Ornek: Herhangi bir sınıfa ait oğrencilerin isimlerini ve numaralarını bir dosyada saklamak isteyelim.
Oncelikle dosyanın icine ilk bilgilerin verilmesi amacıyla Output modunda acılması gerekir. Dosyamızın ismi; Ogrenci ve numarası da 4 olsun, dosyamız programın yazıldığı klasorde saklansın dolayısıyla yol ismi vermiyoruz (bunlar bizim belirleyeceğimiz değerler ve ifadeler, ancak başlangıcta keyfi olarak verdiğimiz bu değerleri gerekli olan yerlerde başlangıcta verildiği gibi kullanmamız gerekir). FileOpen satırında dosya numarası 4 olarak verildiği icin WriteLine ve FileClose satırlarında da artık 4 olarak kullanılması gerekir, aksi halde bilgisayar hata verecektir.
Ornek - Yeni Kayıt
Private Sub Yeni_Kayit()
Dim n,p,numara as integer, isim as string
n = InputBox("Kac Oğrenci var")
FileOpen(4, "c:\ogrenci.txt", OpenMode.Output)
For p = 1 To n
isim = InputBox(p & ". Oğrencinin ismini verin")
numara = InputBox(p & ". Oğrencinin numarasını verin")
'oğrencilerin isim ve numaraları Ogrenci isimli dosyaya yazılıyor
WriteLine (4, isim, numara)
Next p
FileClose (4) 'Dosya kapatılıyor
End
End Sub
İkinci olarak sınıfa yeni oğrencilerin geldiği varsayılırsa, mevcut dosyaya bu oğrencilerin ilave edilmesi ve Ogrenci isimli dosyanın Append modunda acılması gerekir. Bu işlem icin yukarıdaki programda FileOpen satırındaki Output ifadesinin Append şeklinde değiştirilmesi yeterli olacaktır. Ancak uygulama olması acısından istenirse Dosya ismi değiştirilmemek kaydıyla İlave Kayıt kısmında dosya numarası değiştirilebilir. Buna gore program aşağıdaki gibi olabilir.
Ornek - İlave Kayıt
Private Sub ilave_Kayit()
Dim n,p,numara as integer, isim as string
n = InputBox("İlave edilecek Kac Oğrenci var")
FileOpen(7, "c:\ogrenci.txt", OpenMode.Append)
For p = 1 To n
isim = InputBox(p & ". Oğrencinin ismini verin")
numara = InputBox(p & ". Oğrencinin numarasını verin")
'oğrencilerin isim ve numaraları Ogrenci isimli dosyaya ilave ediliyor
WriteLine (7, isim, numara)
Next p
FileClose (7) 'Dosya kapatılıyor
End
End Sub
Ornek - Kayıtların Listelenmesi
Oluşturulan dosyanın istenirse iceriği (tum kayıtları) ekrana getirilebilir. Bunun icin dosyanın okuma (Input) modunda acılması gerekir. Aşağıdaki program daha once oluşturulan ogrenci.txt isimli dosyanın kayıtlarını ekrana tek tek getirmektedir. Bu programda dikkat edilmesi gereken husus ogrenci.txt isimli dosyada kac kayıt bulunduğunun bilinmemesidir. Bu durumda FileOpen komutu ile dosya acıldıktan sonra oncelikle her kayıttan once okunacak kaydın olup olmadığının EOF() komutu ile kontrol ettirilmesidir. Eğer EOF() komutu false yani 'okunacak kayıt var' sonucuna varırsa, bu durumda ilk Input satırı devreye girmekte ve ogrenci.txt isimli dosyanın icinden n. kaydın isim ve numarasını okumaktadır. Daha sonra dosyadan okunan değişken değerleri debug.writeline komutu ile ekrana yazdırılmaktadır. Bundan sonra sıra diğer kayıt icin tekrar kayıt sonuna gelinip gelinmediğinin kontrol ettirilmesine gelmektedir. Eğer kayıt sonuna gelindi ise (okunacak başka kayıt yok ise) bu durumda acılan dosya FileClose komutu ile kapatılmakta ve program sona ermektedir.
Private Sub Kayitlarin_Listelenmesi()
Dim isim As String, numara As Integer
FileOpen(12, "c:\ogrenci.txt", OpenMode.Input)
Debug.WriteLine("İsim - Numara")
Do
If EOF(12) Then
Debug.WriteLine("Kayıt Sonu")
Exit Do
Else
Input(12, isim)
Input(12, numara)
Debug.WriteLine(isim & " " & numara)
End If
Loop
FileClose(12)
End Sub
Ornek – Kayıt Duzeltme
ogrenci.txt dosyasına girilen bilgiler yanlış girilmiş olabilir. Bu durumda yanlış girilen bilgilerin doğru bilgiler ile değiştirilmesi (duzeltilmesi) gerekir. Bununla ilgili program aşağıda verilmiştir.
Program iki parcalıdır, birinci parcasında sozkonusu dosyada kac adet kayıt bulunduğu bilgisayara buldurulmaktadır. Ogrenci.txt isimli dosyanın icinde kac adet kayıt bulundu bilinmediği icin bir onceki ornekte olduğu gibi, kayıt sonuna gelinip gelinmediğini EOF() komutu ile kontrol ettirilerek butun kayıtlar okutulmakta ve kayıt sayısı n değişkeni ile belirlenmektedir.
Programın ikinci parcasında değişik bir durum sozkonusudur. Amac yanlış girildiği varsayılan kaydın duzeltilmesi olduğu icin oncelikle sozkonusu kayda, bu kayda ait bilgilerden birisi ile ulaşmak gerekmektedir. Ogrenci.txt isimli dosyanın herbir kaydında oğrenci isimleri ve numaraları vardır. Dolayısıyla bu iki bilgiden herhangibirisi ile yanlış bilgiye ulaşılabilir. Aşağıdaki program yanlış bilgiye ilgili kaydın 'isim bilgisi' ile ulaşmaktadır (istenirse aynı işlemler diğer bilgi olan oğrenci numarası ile de yapılabilir). Dolayısıyla programın oncelikle yanlış girilmiş olan oğrenci ismini sorması (bilmesi) gerekmektedir. Programın işleyiş sırası şu şekildedir: oncelikle FileOpen komutu ile iki adet dosya acılmaktadır. Bunlardan gecici.txt isimli olan Output modunda acılmakta ve ilk defa oluşturulmaktadır. Diğer dosya ise icinde yanlış bilginin bulunduğu ogrenci.txt isimli dosyadır. Bu dosyada Input olarak okuma modunda acılmıştır. Dikkat edilirse aynı anda iki dosya da acık durumdadır. Bilgisayar yanlış oğrenci ismini oğrendiğine gore; ogrenci.txt isimli dosyadan okuduğu her bilginin yanlış bilgiye eşit olup olmadığını karşılaştırmaktadır. Eğer yanlış bilgiye ulaşılmadı ise ogrenci.txt isimli dosyadan okunan bilgiler herhangibir değişikliğe uğratılmadan olduğu gibi gecici isimli dosyaya yazılmaktadır. Eğer ogrenci.txt isimli dosyadan okunan bilgilerden istenen kayda ulaşıldı ise bu durumda yeni kayıt icin doğru bilgiler kullanıcıya sorulmakta ve gecici.txt isimli dosyaya yazılabilmesi icin isim = yeni_isim ve numara = yeni_numara işlemi ile gecici.txt isimli dosyaya yazılabilir hale gelmektedir. İşlem sonunda elimizde iki adet dosya bulunmaktadır. Birincisi ogrenci.txt isimli dosyadır ki icinde yanlış bilgi bulunmaktadır, diğeri ise gecici.txt isimli dosyadır ki icinde doğru (duzeltilmiş) bilgiler bulunmaktadır. Dolayısıyla Kill komutu ile ogrenci.txt isimli dosya silinmekte ve icinde doğru bilgilerin bulunduğu gecici.txt isimli dosyanın ismi ogrenci.txt olarak değiştirilmektedir.
Private Sub Kayit_Duzeltme()
'ogrenci.txt dosyasında kac kayıt olduğu bulunuyor
Dim isim, deg_isim, yeni_isim As String, numara, yeni_numara, n, u As Integer
FileOpen(48, "c:\ogrenci.txt", OpenMode.Input)
Do
If EOF(48) Then
MsgBox("Ogrenci isimli dosyada " & n & "kayıt vardır")
FileClose(48)
Exit Do
Else
Input(48, isim)
Input(48, numara)
n = n + 1
End If
Loop
'Kayıt Duzeltme işlemleri yapılıyor
deg_isim = InputBox("Kaydı değiştirilecek oğrencinin ismini verin")
FileOpen(1, "c:\gecici.txt", OpenMode.Output)
FileOpen(2, "c:\ogrenci.txt", OpenMode.Input)
For u = 1 To n
Input(2, isim)
Input(2, numara)
If isim = deg_isim Then
yeni_isim = InputBox("Yeni ismi verin")
yeni_numara = InputBox("Yeni numarayı verin")
isim = yeni_isim
numara = yeni_numara
End If
WriteLine(1, isim, numara)
Next u
FileClose(1, 2)
Kill("c:\ogrenci.txt")
Rename("c:\gecici.txt", "c:\ogrenci.txt")
MsgBox("Kayıt Duzeltme İşlemi Bitti")
End Sub
Ornek – Kayıt Silme
Ogrenci.txt dosyasına girilen bilgilerden bazıları silinmek istenebilir. Bu işlem yukarıdaki programın neredeyse aynısıdır. Tek farkı istenen bilgiye ulaşıdığında bu bilginin gecici.txt isimli dosyaya yazılmayıp atlanmasıdır. WriteLine (1, isim, numara) satırının silinmek istenen bilgiye ulaşıldığında, işleme sokulmadığına dikkat edin. İstenilen kaydın silinmesine ilişkin program aşağıdadır.
Private Sub Kayit_Silme()
'ogrenci.txt dosyasında kac kayıt olduğu bulunuyor
Dim isim, sil_isim As String, numara, n, u As Integer
FileOpen(48, "c:\ogrenci.txt", OpenMode.Input)
Do
If EOF(48) Then
MsgBox("Ogrenci isimli dosyada " & n & "kayıt vardır")
FileClose(48)
Exit Do
Else
Input(48, isim)
Input(48, numara)
n = n + 1
End If
Loop
'Kayıt Silme İşlemleri yapılıyor
sil_isim = InputBox("Kaydı silinecek oğrencinin ismini verin")
FileOpen(1, "c:\gecici.txt", OpenMode.Output)
FileOpen(2, "c:\ogrenci.txt", OpenMode.Input)
For u = 1 To n
Input(2, isim)
Input(2, numara)
If isim sil_isim Then
WriteLine(1, isim, numara)
End If
Next u
FileClose(1, 2)
Kill("c:\ogrenci.txt")
Rename("c:\gecici.txt", "c:\ogrenci.txt")
MsgBox("Kayıt Silme İşlemi Bitti")
End Sub
NOT

__________________