1. meslek sırrı MOBİL PROGRAMLAMA
PCWORLD.COM.TR TEMMUZ ’10114
Volkan Atasever
volkan@volkanatasever.com
www.volkanatasever.com
Bu ayki yazıma başlamadan önce
okuyucularımızın bilmesi gere-
ken önemli noktalar mevcut. Baktığı-
mız zaman dergiyi yeni okumaya baş-
lamış okuyuculardan e-postalar almak-
yız. Çoğunlukla her ayki konuyu birbi-
rinden bağımsız ve tek ayda ortaya bir
uygulama koyabilecek şekilde yazıyo-
ruz. Yeni okumaya başlayanlar da her
ayki yazıyı ve bilgileri okuyarak bir giriş
yapabilir. Ama yaptığımız uygulamala-
rın hangi ortamda çalıştığını deneyim-
li olmayan bir kullanıcı anlayamayabili-
yor. Bunun için her ay uygulamayı yap-
tığımız platform hakkında küçük bilgi-
ler vereceğiz. Uygulamaları Windows
Mobile Professional 6.0 üstünde ge-
liştirmekteyiz. Çeşitli cihazlarda bu iş-
letim sistemini çalıştırıyor. Daha tam
oturmamış Windows Phone 7 serisi
için geliştirme araçları sürülmüş fakat
ilk aşamada yeni başlayanların otur-
mamış bir sistemde çalışması zorluklar
getirebiliyor. Şahsım adına Windows
Mobile 6.5 işletim sistemini ise bir ge-
çiş süreci olarak görmekteyim. Win-
dows Mobile 6.0’dan Windows Phone
7 serisini yumuşatmak adına yapılmış
olduğunu görüyoruz. Eski kullanıcılar
yıllar önce ki Windows 98’in hakimiye-
tini hatırlayacaklardır. Windows XP’ye
geçiş sert bir şekilde olmamış arasü-
rümlerle geçiş bizim için kolaylaştırıl-
mıştı. Bu sürümler Windows 98 SE ve
Windows ME işletim sistemleriydi. Ge-
liştiricilerin veya “geek” tabir ettiğimiz
bu işlerle hobi olarak ilgilenen okuyu-
cuların ufkunu açmak adına standart
rutinimizde molalar verip Windows
Phone 7 serisine ve java destekli mobil
cihazlara da değineceğiz. 3 aylık oku-
ma ve yazma, dosya işlemleri serimize
ise bu ayki stream işlemlerine değine-
rek sonlandıracağız. Bu sayede verileri-
mizi saklayabileceğimiz aynı zamanda
depolanan küçük verilerle işlem yapa-
bileceğiz. Bu ayki konunun künye kar-
tını yazmak istiyorum;
İşletim sistemi: Windows Mobile 6.0
Professional
Cihaz: İşletim sistemi çalışan her cihaz
Kullanılan programlama dili: C#
Framework: .NET Compact
Framework 3.5
Konu: Streamler (Akışlar)
Streamler ile çalışmak
Stream sınıfını System.IO içindeki bir
temel sınıf olarak tanımlayabiliriz.
System.IO altında tanımlanmış Stre-
am aynı zamanda bir özet sınıftır. Tek
başına bu sınıfı türetemezsiniz. Fakat
bu sınıftan diğer işlemlerimizi yoğun
olarak yapacağımız sınıflar türemiş-
tir. Bunlar; FileStream, MemoryStre-
am, StreamWriter, StreamReader, Bi-
naryWriter, BinaryReader, StringWri-
ter ve StringReader’dır. Çoğu sınıfta
bu sınıfın temel metodları kullanılıyor.
Stream’ler herhangi bir dosyayı IO (in-
put output) işlemleri yaparken gördü-
ğü gibi aynı zamanda klavye, ekran
vb. elemanlar üzerinde de işlem ya-
pabilir. Bu dosya işlemlerini inceleme-
den önce FileMode ve Encoding kav-
ramları önem taşıyor. Bunlara değine-
cek olursak;
Encoding kavramı ve
Encoding sınıfı
Encoding kavramının önemi İngilizce
dışında çeşitli dillerle çalışıldığı zaman
anlaşılır. Herhangi bir İngilizce Win-
dows Mobile yüklü bir akıllı cihazda
Türkçe karakter içeren dosyayı kullan-
mak istersek encoding sınıfını kullan-
mamız gerekiyor. Bu sayede tüm ma-
kinelerde Türkçe karakterler sorunsuz
görüntülenebilecektir.
FileMode liste
(Enumeration)
Bir dosya ile işlem yapmadan önce o
dosyanın yeniden oluşturulup oluştu-
rulmayacağı ya da dosya mevcut ise
mevcut dosya içerisinde işlem yapılıp
yapılmayacağı bilgisini veren listedir.
FileAccess liste
(Enumeration):
Bu dosya ile hangi işlemin yapılabilece-
ğini önceden belirtmek için kullandığı-
mız bir listedir. Bu işlemler okuma, yaz-
ma gibi işlemlerdir.
FileAccess.Read: Dosyadan okunaca-
ğını belirtir.
FileAccess.ReadWrite: Dosya ile hem
okuma hem de yazma işlemleri
yapılacağını belirtir.
FileAccess.Write: Dosya ile yazma
işlemi yapacağını belirtir.
Artık elimizde tüm işlemlerimizi yapa-
bileceğimiz bilgiler bulunuyor. Alet
çantamız tıka basa dolu. Kısaca artık
bir dosya işlemini yapma ve bunlar üs-
tünde inşa yapma vakti geldi. Başlan-
gıç olarak tüm dosya işlemlerini yapa-
bildiğimiz FileStream sınıfını tanıtıp di-
ğer sınıflarında özetini geçeceğiz. Hep-
1
2
Bu ayki yazımızda dosya işlemleri, streamler, dizin işlemleri gibi konuları işliyoruz.
Windows Mobile’da Stream
mobil programlama_temmuz.indd 114mobil programlama_temmuz.indd 114 24.06.2010 23:2224.06.2010 23:22
2. meslek sırrı MOBİL PROGRAMLAMA
115PCWORLD.COM.TRTEMMUZ ’10
sinin uygulamasını içeren bir örnek ise
dosya işlemlerini pratiğe dökmek için
önem kazanıyor.
FileStream Sınıfı: FileStream sınıfı-
nı oluşturmak için öncelikle bir patika
yani yol belirlememiz lazım. Ardından
en kısa tanımıyla dosyayı açma modu-
nu belirlememiz lazım. Bunun için File-
Mode listesini kullanıyoruz. Diğer kulla-
nımlar için 5 aşırı yüklenmiş kurucu me-
todu mevcud. Bir dosya üzerinde senk-
ron veya asenkron çalışmak için diğer
aşırı yüklenmiş kurucularını çalıştırma-
mız gereklidir.
MemoryStream Sınıfı: FileStream ile
yaptığımız işlemleri bir dosya üzerinde
yapmak yerine bellek üzerinde gerçek-
leştirdiğimizi düşünebiliriz. 7 tane aşırı
yüklenmiş kurucu metoda sahip.
StreamWriter Sınıfı: StreamWriter sı-
nıfı ile kodlanmış karakter çıktıları ile
birlikte çalışabiliriz. Bu işlemler için üre-
tilmiş bir sınıftır.
StreamReader Sınıfı: Bu sınıfla be-
raber stream olan bir veriyi string ifa-
de olarak okuyabiliriz. Read() ReadLi-
ne() ve ReadToEnd gibi esnek metod-
ları mevcuttur. Read metodu bir karak-
ter okumamızı sağlarken ReadLine bir
satırı okuyor. ReadToEnd ise mevcut
pozisyondan stream’in sonuna kadar
okuma yapıyor.
StringWriter Sınıfı: Bu sınıf TextWri-
ter sınfından türemiş. Encoding yani
belirli bir formatta kodlanmış veriyi
string olarak yazmaya yarıyor. Sınıf içe-
risinde bulunan metodları Resim 3’te
görebilirsiniz.
StringReader Sınıfı: Bu sınıf TextRe-
ader sınıfından türemiştir. Encoding
yani belirli bir formatta kodlanmış ve-
riyi string olarak okumaya yarar. Sınıf
içerisinde bulunan metodlar ise 4. re-
simde görülebilir.
Temel uygulamanın örnek kodu:
C# Kodu:
using System;
using System.Windows.Forms;
using System.IO;
using System.Text;
namespace STEMMUZDeviceProject24
{
public partial class Form1 :
Form
{
public Form1()
{
InitializeCompo
nent();
}
private void button1_
Click(object sender, EventArgs e)
{
FileStream fs = new
FileStream(“volkan.txt”,FileMode.
Open);
string icerik=””;
byte[] dizi=new
byte[fs.Length];
fs.Read(dizi, 0,
dizi.Length);
icerik = Encoding.
Unicode.GetString(dizi, 0, dizi.
Length);
textBox1.Text=icerik;
fs.Close();
}
private void button2_
Click(object sender, EventArgs e)
{
FileStream fs = new
FileStream(“volkan.txt”, FileMo
de.Create);
string icerik = text
Box1.Text;
byte[] dizi = Enco
ding.Unicode.GetBytes(icerik);
fs.Write(dizi, 0,
dizi.Length);
fs.Close();
}
private void button3_
Click(object sender, EventArgs e)
{
MemoryStream mems=new
MemoryStream();
3 5
4
mobil programlama_temmuz.indd 115mobil programlama_temmuz.indd 115 24.06.2010 23:2224.06.2010 23:22
3. meslek sırrı MOBİL PROGRAMLAMA
PCWORLD.COM.TR TEMMUZ ’10116
byte[] dizi = mems.
GetBuffer();
string okunan = Enco
ding.Unicode.GetString(dizi, 0,
dizi.Length);
mems.Close();
}
private void button4_
Click(object sender, EventArgs e)
{
MemoryStream mems =
new MemoryStream();
string yazilan =
textBox1.Text;
byte[] dizi = Enco
ding.Unicode.GetBytes(yazilan);
mems.Write(dizi, 0,
dizi.Length);
}
private void button5_
Click(object sender, EventArgs e)
{
FileStream fs = File.
Create(“volkan.txt”);
StreamWriter writer
= new StreamWriter(fs, Encoding.
Unicode);
writer.
WriteLine(“deneme”);
writer.Close();
}
private void button6_
Click(object sender, EventArgs e)
{
string deger = “”;
StreamReader rea
der = new StreamReader(File.
Open(“volkan.txt”, FileMode.
Open), Encoding.Unicode);
deger = reader.Read
ToEnd();
reader.Close();
MessageBox.
Show(deger);
}
private void button7_
Click(object sender, EventArgs e)
{
FileStream fs = new
FileStream(“volkan.txt”, FileMo
de.Create);
BinaryWriter writer =
new BinaryWriter(fs, Encoding.AS
CII);
string deger = “mer
haba dünya”;
writer.Write(deger);
writer.Close();
}
private void button8_
Click(object sender, EventArgs e)
{
FileStream fs = new
FileStream(“volkan.txt”, FileMo
de.Open);
BinaryReader reader =
new BinaryReader(fs, Encoding.AS
CII);
string deger = rea
der.ReadString();
reader.Close();
MessageBox.
Show(deger);
}
private void menuItem1_
Click(object sender, EventArgs e)
{
MessageBox.
Show(“dosyalar hakkında...”);
}
private void menuItem2_
Click(object sender, EventArgs e)
{
Application.Exit();
}
}
}
FileStream Okuma (Buton 1): Bu
bölümde volkan.txt dosyasını okumak
için açıyoruz. Dikkat edilmesi gereken
husus uygulama neredeyse o klasörün
altında dosyayı arıyor. Length özelliği
ile FileStream’in uzunluğunu öğrenip o
uzunlukta bir byte dizisi oluşturuyoruz.
Read metodu ile de stream içerisindeki
byte bloğunu okuyup byte dizimize ya-
zıyoruz. Ardından unicode kodlaması
ile bu diziyi bir string değişkene atıyo-
ruz. Son olarak bu değişkeni textbox
kontrolünde göstermekteyiz.
FileStream Yazma (Buton 2): Bu me-
todda FileMode listesi ile yeni bir dosya-
nın oluşturulacağı... Aynı isimle bir dos-
ya mevcutsa üstüne yazacağımızı belir-
tiyoruz. Textbox kontrolünden içeriği
alıp bunu Unicode kodlaması ile bera-
ber bir byte dizisine aktarıyoruz. Türe-
tilmiş nesne olan FileStrream üzerinden
ise Write() metodunu çağırarak bu dizi-
yi dosyaya yazıyoruz.
MemoryStream Okuma(Buton 3):
MemoryStream sınfından bir nesne ta-
nılıyoruz. GetBuffer() metodunu kulla-
narak bellekte oluşturulmuş stream’i
bir byte dizisi olarak alıyoruz. Unico-
de kodlamasını kullanarak bir string di-
ziye yazıyoruz. Close() metodu ile ise
MemoryStream’i kapatıyoruz.
MemoryStream Yazma (Buton 4):
Textbox’teki metni Unicode standart-
larında kodlayarak bir byte dizisine atı-
yoruz. Write metodu ile mevcut stre-
am üzerine byte bloğu olarak yazıyo-
ruz. Diğer alternatiflerse WriteTo() me-
todu, WriteByte() metodu. Bu metod-
lardan WriteTo, MemoryStream’in bü-
tün içeriğini stream’e yazıyor. WriteBy-
te ise stream üzerindeki o anda bulunu-
lan pozisyona bir byte yazıyor.
StreamWriter (Buton 5): FileStream
ile açtığımız dosyayı WriteLine() meto-
dunu kullanarak yeni bir satır oluşturup
yazar.
StreamReader (Buton 6): ReadTo-
End() metodu mevcut dosyadaki mev-
cut pozisyon başlayarak sonuna kadar
okur ve geriye string değeri döndürür.
Bu dosyanın bir stream olarak sunuldu-
ğu unutulmamalı.
BinaryWriter (Buton 7): ASCII kod-
laması kullanarak dosyayı binary for-
matta yazar. Write metodu ile mevcut
stream’in üzerine değeri yazar.
BinaryReader (Buton 8): ASCII kod-
laması kullanarak dosyayı binary for-
matta okur. ReadString() metodu ile
mevcut dosyanın yani verebileceği-
miz bir stream’in bir sonraki string ti-
pini okur. Kullanılan kodlama ve string
ifadenin uzunluğunu göz önüne alarak
stream’inde mevcut pozisyonunu de-
ğiştirir.
mobil programlama_temmuz.indd 116mobil programlama_temmuz.indd 116 24.06.2010 23:2224.06.2010 23:22