Merhaba, bu dersimizde dosya işlemlerinden bahsedeceğiz. Dosya işlemlerinden kastımız, bir dosyadan okumak ve bir dosyaya yazmak. Bu işlemler haricinde dosyalarla alakalı olan birkaç sınıftan da bahsedeceğiz. Aslında dosyalarla ilgili anlatılacak şeyler çok fazla ve bir makaleye sığmaz; ancak bu makalede sadece önemli noktalardan ve en çok kullanabileceğiniz şeylerden bahsedeceğiz.
DERS 13 : Dosya İşlemleri
Directory ve File Sınıfları
Directory ve File sınıfları System.IO isim alanında (namespace) bulunur. Dolayısıyla bu sınıfları kullanabilmek için, programımıza using System.IO; satırını eklemeliyiz. Directory ve File sınıflarında statik metotlar bulunur. Bu iki sınıfın birçok metodu benzerdir. Tek farkları Directory sınıfı klasörler üzerinde işlem yaparken File sınıfı dosyalar üzerinde işlem yapar. Bu metotlara örnek olarak Delete, Exists ve Move’u verebiliriz. Aşağıdaki kod bloğunda Directory ve File sınıfına ait bazı metotların kullanımını ve açıklamalarını görebilirsiniz.
static void Main(string[] args)
{
string directory = "C:\\Folder";
string file = "C:\\Folder\\File.txt";
Directory.CreateDirectory(directory); //Klasör oluşturur
bool isDirectoryExists = Directory.Exists(directory); //Klasör var mı diye bakar
string[] directories = Directory.GetDirectories(directory); //Klasördeki klasörleri getirir
string[] files = Directory.GetFiles(directory); //Klasördeki dosyaları getirir
Directory.Move("C:\\Folder", "C:\\Folder2"); //Klasörü ve içindekileri taşır, ismini değiştirir
Directory.Delete(directory); //Boş klasörü siler
File.Create(file); //Dosya oluşturur
bool isFileExists = File.Exists(file); //Dosya var mı diye bakar
File.Move("C:\\Folder\\File.txt", "C:\\Folder\\File2.txt"); //Dosyayı taşır, ismini değiştirir
File.Delete(file); //Dosyayı siler
}
DirectoryInfo ve FileInfo Sınıfları
Directory ve File sınıfları klasör ve dosyalar üzerinde işlemler yaparken sadece dosya yolunu kullanırlar ve örneğin bir klasördeki tüm dosyaları getiren metodu çağırdığınızda size sadece dosyaların yollarını döndürür. DirectoryInfo ve FileInfo sınıfları ise, dosya yolunun haricinde dosya adı, uzantısı, boyutu, oluşturulma zamanı gibi ekstra bilgiler verir. Bu iki sınıf statik değildir ve bir obje üzerinden erişilebilir. Aşağıdaki örneklere bakabilirsiniz:
static void Main(string[] args)
{
string directory = "C:\\Folder";
string file = "C:\\Folder\\File.txt";
DirectoryInfo dInfo = new DirectoryInfo(directory);
DateTime dCreateDate = dInfo.CreationTime; //Oluşturulma zamanı
dInfo.Delete(); //Klasörü siler
string dFullName = dInfo.FullName; //Klasörün yolu
string dName = dInfo.Name; //Klasörün adı
DirectoryInfo parent = dInfo.Parent; //Üst klasör bilgisi
FileInfo fInfo = new FileInfo(file);
DateTime fCreateDate = fInfo.CreationTime; //Oluşturulma zamanı
DirectoryInfo fDirectory = fInfo.Directory; //Bulunduğu klasörün bilgisi
string fDirectoryName = fInfo.DirectoryName; //Bulunduğu klasörün adı
string fExtension = fInfo.Extension; //Uzantısı
string fFullName = fInfo.FullName; //Dosyanın yolu
long fSize = fInfo.Length; //Dosyanın byte cinsinden boyutu
string fName = fInfo.Name; //Dosyanın adı
}
Dosyaya Yazma
Dosyaya yazma ve dosyadan okuma yapmak için birkaç farklı yöntem mevcut. Bu makalede StreamWriter ve StreamReader sınıflarını kullanacağız. Metin bazlı okuma yazma işlemleriniz için bu sınıfları kullanabilirsiniz. Eğer binary olarak okuma yazma yapacaksanız BinaryWriter ve BinaryReader sınıflarını kullanabilirsiniz. Dosyaya yazma işlemi için StreamWriter sınıfını aşağıdaki gibi kullanıyoruz:
static void Main(string[] args)
{
string file = "C:\\Folder\\File.txt";
FileStream stream = File.Create(file);
StreamWriter sw = new StreamWriter(stream);
sw.WriteLine("Tek satır metin.");
sw.Write("İkinci satır ");
sw.WriteLine("ve devamı.");
sw.WriteLine("Üçüncü satır.");
sw.Close();
}
Gördüğünüz gibi aslında çok basit bir işlem. Eğer ortalıkta bir dosya yoksa File.Create ile dosyamızı oluşturuyoruz ve dönen değeri StreamWriter’a parametre olarak geçiyoruz. Eğer dosya zaten mevcut olsaydı, bu ilk komuta gerek kalmayacaktı ve StreamWriter’a direkt olarak dosyanın yolunu geçebilecektik. Dosya mevcut olduğunda, bu dosyanın içeriğini baştan yazmak yerine ekleme yapmak isterseniz, dosya yolunun yanında Append parametresini de true olarak geçmeniz gerekiyor. StreamWriter sınıfından bir obje (sw) oluşturduktan sonra başlıyoruz dosyaya yazmaya. WriteLine metodu ile dosyaya bir satır yazı yazıp sonuna \r\n karakteri koyuyoruz, yani yeni satırı başlatıyoruz. Eğer WriteLine yerine Write metodunu kullanırsak, \r\n karakteri koymamış oluyoruz ve daha sonraki komutta aynı satırdan devam ediyoruz. Dosyaya yazma işlemlerimiz bittiğinde Close metoduyla yazdıklarımızın diske kaydedilmesini sağlıyoruz. Eğer Close metodunu kullanmazsak yazdıklarımız bellekte duracaktır ve program kapandığında silinecektir, yani diske kaydedilmeyecektir. Yukarıdaki kod bloğu File.txt dosyasına aşağıdaki gibi bir metin yazdırıyor:
Tek satır metin.
İkinci satır ve devamı.
Üçüncü satır.
Dosyadan Okuma
Okuma işlemi yazma işleminden daha basit. Bu sefer de StreamReader sınıfını kullanıyoruz. Az önce oluşturduğumuz dosyayı aşağıdaki gibi okuyabiliriz:
static void Main(string[] args)
{
string file = "C:\\Folder\\File.txt";
StreamReader sr = new StreamReader(file);
string firstLine = sr.ReadLine();
string otherLines = sr.ReadToEnd();
sr.Close();
}
İlk satırda StreamReader objemizi (sr) oluşturuyoruz. Oluştururken okumak istediğimiz dosyanın yolunu veriyoruz. Sonrasında ReadLine veya ReadToEndmetotlarını kullanıyoruz. ReadLine metodu, dosyadan satır satır okuma yapmamızı sağlıyor. Bu komutu while döngüsüyle kullanabiliriz. Eğer tüm dosyayı tek seferde okumak istiyorsak ReadToEnd metodunu kullanıyoruz. Bu metot bize tüm dosyayı tek satır olarak döndürüyor. Dönen sonuç içerisindeki \r\n karakterleri satır sonlarını ifade ediyor. Burada dikkat etmeniz gereken nokta, eğer yukarıdaki koddaki gibi önce ReadLine sonra ReadToEnd metodunu kullanırsanız, ReadLine ile ilk satır okunduğu için ReadToEnd metodu, ikinci satırdan itibaren okumaya başlayacaktır.
Dosya işlemleriyle alakalı, internette birçok örnek proje bulabilirsiniz. Eğer projenizde veri saklamak istiyorsanız dosyaya yazmak yerine veritabanı kullanmanız daha uygun olacaktır. Dolayısıyla dosya işlemleri daha çok uygulamanın konfigürasyonlarını kaydetmek için kullanılır. Böylece bu dersimizin sonuna geldik. Bir sonraki dersimizde görüşmek üzere…