Yayınlama: 2000
Güncelleme: 2 Ekim 2020
Güncelleme: 2 Ekim 2020
Binary(ikili) Dosya Oluşturma ve Yazma
Bu tür dosyalar içinde metin aranmaz ve metinle ilgili işlemler de yapılmaz.
Ama örneğin bir GIF dosya yapısını öğrendiniz ve dosya içindeki resmi ekrana basmak istiyorsunuz.
Bunun için dosyayı binary olarak açıp içindeki kodları resim kodlarına dönüştürmelisiniz.
Binary dosya çalışma sistemi RANDOM dosya gibidir ancak önceden bir kayıt yapısı belirleme gerekliliği yoktur.
GET# ve PUT# komutları ile dosyanın istenilen kısmını okuyabilir, değişiklik yapabilirsiniz.
Binary Dosya Açma
OPEN "c:\ornek\ikili.bin" FOR BINARY AS #1Random dosyada olduğu gibi dosya yoksa oluşturulur. Varsa sorun çıkmaz. Var olan dosya kullanılır.
Üstteki kodu denerseniz, dosya yok ise boş bir dosya oluşur.
A$ = "Mesut" PUT #1, , A$A$ değişkeni içeriğini PUT# ile dosyaya yazdırdık.
Kayıt numarası belirtmedik.
Öncesinde dosyaya herhangi bir okuma veya yazma işlemi yapılmadığı için ilk 5 byte yazdırılır.
A$ = CHR$(13) + CHR$(10) + "Akcan" PUT #1, , A$İkinci satır oluşturuluyor.
Sıralı erişimli dosyada satır atlamak için ikinci bir PRINT# komutu kullanılıyordu ama burada byte byte işlem yapıldığı için satır atlama kodlarını da bizim girmemiz gerekir.
CHR$(13) + CHR$(10) dan oluşan iki karakter sonraki satıra atlamayı sağlar.
ENTER tuşunun yaptığını yapar.
Üstteki kodları deneyip dosya içeriğini inceleyin sonra aşağıdaki kodları deneyin.
Burada kayıt konumu olarak 2 yazılı.
Değişken içeriği dosyanın 2. baytından başlayarak doldurulur.
Tabii ki o kısımdaki eski bilgiler değişmiş olur.
PUT #1, 2, A$ CLOSE
Binary Dosya Okuma
Dosyadan byte olarak bilgi okumak için GET# komutu kullanılır.GET # dosyano, konum, değişkenşeklinde kullanılır. Konum belirtilmezse PUT# komutunda olduğu gibidir.
Binary dosyalarda çalışırken byte olarak okuduğumuz verilerden bir kısmı sayı içeriyor olabilir.
Örneğin bir resim dosyasında ilk 3 bayt resim türünü, sonraki 2 byte renk derinliğini, sonraki 15 byte tanımlama vs.. olabilir.
Bunları tek tek GET komutuyla diskten okutmak yerine gerekli bilgi bir seferde bir STRING değişkene atanır.
MID$ ile gerekli bytelar değişkenden alınır.
Fakat sayısal değerler byte'a dönüştüğünde farklı string değerlere sahip olur.
Bir önceki bölümde dosyayı HexViewer ile incelediğimizde görmüştük.
Bu tür bilgileri dönüştürmek için QuickBASIC içindeki hazır fonksiyonlar kullanılır.
STRING'İ SAYIYA DÖNÜŞTÜRME
CVI: (ConVert to Integer) 2 byte'lık String'i Integer sayı değerine dönüştürür. ÖrneğinPRINT CVI("[x") 'Sonuç : 30811CVS: (Convert to Single) 4 byte'lık String'i Single sayı değerine dönüştürür.
PRINT CVS("AbCd") 'Sonuç : 1.441678E+22CVL: (Convert to Long) 4 byte'lık String'i Long sayı değerine dönüştürür.
PRINT CVL("AbCd") 'Sonuç : 1682137665CVD: (Convert to Double) 8 byte'lık String'i Double sayı değerine dönüştürür.
PRINT CVD("Mesut.Akcan") 'Sonuç : 4.412931560721696D+208 'İlk 8 karakteri dönüştürdü
SAYIYI STRING'E DÖNÜŞTÜRME
MKx$ komutları CVx komutlarının tersini yapar.MKI$: (MaKe Integer to $tring) Integer sayı değerini 2 baytlık(karakter) String'e dönüştürür.
Örneğin:
PRINT MKI$(30811) 'Sonuç: [xMKS$: Single sayı değerini 4 baytlık String'e dönüştürür.
MKL$: Long sayı değerini 4 baytlık String'e dönüştürür.
MKD$: Double sayı değerini 8 baytlık String'e dönüştürür.
Okuma ya da yazma konumu
LOC fonksiyonu ile yazılacak ya da okunacak kayıt numarası öğrenilir.Binary dosyada byte olarak konumu, random dosyada ise kayıt numarasını verir.
OPEN "c:\ornek\test.txt" FOR BINARY AS #1 a$ = MKI$(5214) PUT #1, 8, a$ PRINT LOC(1) CLOSE
UYGULAMA
BMP formatında bir resim bulun ve c:\ornek klasörüne kopyalayın.Dosyanın adını resim.bmp olarak değiştirin. Aşağıdaki kodları yazıp çalıştırın.
Bu uygulama resim dosyanız hakkında bazı bilgileri ekrana yazacaktır.
BMP dosya yapısı hakkında daha detaylı bilgi
CLS dosya$ = "c:\ornek\resim.bmp" OPEN dosya$ FOR BINARY AS #1 'PRINT "Dosya boyutu : "; LOF(1) baslik$ = SPACE$(14) boyut$ = SPACE$(4) GET #1, 1, baslik$ GET #1, 15, boyut$ bmptur = CVI(boyut$) IF bmptur = 40 THEN ' 12 ise OS/2 BMP baslikbilgi$ = SPACE$(40) GET #1, 15, baslikbilgi$ renkd = CVI(MID$(baslikbilgi$, 15, 4)) ELSE PRINT "Windows BMP resim dosyası değil" END END IF dosyag = CVL(MID$(baslik$, 3, 4)) PRINT "Dosya Genişliği:"; dosyag; "byte" PRINT "Renk Derinliği :"; renkd; "bit" baslgen& = CVL(MID$(baslikbilgi$, 1, 4)) resGenislik = CVL(MID$(baslikbilgi$, 5, 4)) PRINT "Genişlik: "; resGenislik resYukseklik = CVL(MID$(baslikbilgi$, 9, 4)) PRINT "Yükseklik: "; resYukseklik PRINT IF bmptur = 40 THEN PRINT "Sıkıştırma: "; skstrma = CVL(MID$(baslikbilgi$, 17, 4)) IF skstrma = 0 THEN PRINT "Yok" IF skstrma = 1 THEN PRINT "8 Bit" IF skstrma = 2 THEN PRINT "4 Bit" kullRenk = CVL(MID$(baslikbilgi$, 33, 4)) PRINT "Kullanılan renk sayısı:"; kullRenk END IF CLOSE
Dosyayı Silme
DOS komut satırında bir dosyayı silmek için DEL komutu kullanılır.Ama QuickBasic içinden dosyası silmek istersek ne olacak?
QuickBasic içinde de dosya silmek için bir komut var ama DEL değil KILL(öldür)
Kullanımı:
KILL "sürücü:\dosyayolu\dosyaadı"Örnek:
KILL "c:\ornek\resim.bmp"Dikkat ! Bu şekilde sildiğiniz dosya kalıcı olarak silinir. Özel program kullanmadan ulaşmanız mümkün değildir.
Dosya adını değiştirme
NAME komutu ile dosya adı değiştirilebilir.NAME "eskiad.txt" AS "yeniad.dat"
Konum değiştirme
Dos komut satırında CD ile bulunduğunuz klasörü öğrenebilir ve konumu değiştirebilirsiniz.Aktif klasörden başka bir klasöre geçiş yapmak için QuickBasic'de CHDIR komutu kullanılır.
Sürücü ve yol belirtilir.
CHDIR "D:\PROGRAMLAR"
Klasördeki Dosyaların Listesi
DOS'da belirtilen klasördeki dosyaların listesini DIR ile alırız.QuickBasic'de ise FILES komutu kullanılır.
Kullanımı:
FILES dosya türü tanımı
FILES ' bulunduğun klasörde tüm dosyalar FILES "*.bmp" ' BMP resim dosyaları FILES "c:\ornek\*.txt" ' belirtilen klasörde txt dosyalar FILES "?.B*" ' Dosya adı tek harfli, uzantısı B ile başlayan dosyalar.
Yeni Klasör Oluşturma
Dos'da MKDIR ya da MD komutu ile klasör oluşturulur.QuickBasic'de ise MKDIR ile.
MKDIR "C:\ORNEK"Eğer klasör yoksa yeni bir klasör oluşur.
Klasör varsa Path/File access error hatası belirir.
Klasörü Silme
Dos'da RMDIR ya da RD ile klasör silinir.QuickBasic'de ise RMDIR ile klasör silinir.
RMDIR "C:\ORNEK"Klasör içeriği boş değilse Path/File access error hatası belirir. Klasörü silmek için önce içindekileri silmek gerekir.
KILL "C:\ORNEK\*.*" RMDIR "C:\ORNEK"
Dosya Kopyalama
QuickBasic'de dosya kopyalamak için bir komut yoktur.Kısayoldan SHELL komutu ile tüm dos komutlarını kullanabiliriz ama Shell komutu kullanmadan dosyayı nasıl kopyalarız?
Örnek kodlar aşağıda. Çok büyük dosyalarda bu kodlar sorun çıkarır.
Büyük dosyalar için ek kodlar gerekir. Bu sorunu çözmek de size ödev olsun 😊
OPEN "c:\ornek\ikili.bin" FOR BINARY AS #1 g& = LOF(1) : a$ = SPACE$(g&) GET #1, , a$ CLOSE OPEN "c:\ornek\kopya.bin" FOR BINARY AS #1 PUT #1, , a$ CLOSE PRINT "Dosya kopyalandı"
Hiç yorum yok:
Yorum Gönder