Dosyalar ve Dizinler ( 1

Bedros Sanches

Emektar
5 Ocak 2006
525
12
Austin,Texas
DOSYALAR ve DİZİNLER ( 1 )


Bu makalemizde C# dilini kullanarak .NET Framework’ un dosya ve dizinlerle çalışmamızı sağlayan sınıflarını inceleyeceğiz. Bunun için projemize System.IO isimuzayını (namespace) eklemiz gerekir. Bu isimuzayının altında File ve Directory sınıfları mevcuttur. File sınıfını diskteki dosyalar (Files) , Directory sınıfını diskteki dizinler (Folders) üzerinde işlemlerimizi yapmak için kullanırız.

Dizinler :
Directory sınıfındaki bütün methodlar statictir. Yani Directory sınıfının bir methodunu kullanmak için Directory sınıfından bir nesne oluşturmak zorunda değiliz. Bu methodları kullanarak, dizin oluşturabilir (create), kopyalayabilir(copy) ya da dizinleri taşıyabiliriz(move).
Diğer yararlı bir sınıf ise DirectoryInfo sınıfıdır. Bu sınıf FileSystemInfo sınıfından türetilmiştir. FileSystemInfo sınıfını dosyalar ve dizinlerle ilgili bilgi almak için kullanırız.

Şimdi Directory sınıfının methodlarını incelemeye başlayalım :

CreateDirectory( ) : Dizin oluşturmak için kullanılır.
Örnek :
Directory.CreateDirectory(@”C:\tmp1\tmp2”);

Bu örnekle C’nin altında tmp1 dizini ve tmp1 dizininin altında tmp2 dizini oluşturmuş oluyoruz.

Delete( ) : Dizin silmek için kullanılır.
Örnek :
Directory.Delete(@”C:\tmp1”, true);

Bu örnekle, tmp1 dizini silinir. Ancak dikkat edilmesi gereken nokta dizimizin boş olup olmamasıdır. Eğer 2. parametre true verilirse dizin altındaki herşeyle birlikte dizini siler. 2. parametreye false değeri verirsek eğer dizin boş değilse hata üretir, dizin boş ise dizini siler.

Exists( ) : Bir dizinin var olup olmadığını anlamak için kullanılır. Geri dönüş değer Boolean türündendir.
Örnek :
if (Directory.Exists(@“C:\tmp1”))
Console.WriteLine(“Dizin var!”);
else
Console.WriteLine(“Dizin yok!”);

Bu örnekle, C:\tmp1 dizinin var olup olmadığına bakıyoruz.

GetCreationTime( ) : Bir dizinin oluşturulma tarihini verir. Geri dönüş değeri DateTime yapısı (struct) türündendir.
Örnek :
Console.WriteLine(“Dosyanın oluşturulma tarihi : {0}”, Directory.GetCreationTime(@“C:\tmp1”));
Çıktı :
Dosyanın oluşturulma tarihi : 28.10.2002 13:00:46

SetCreationTime( ) : Bir dizinin oluşturulma tarihini değiştirmek için kullanılır.
Örnek :
Console.WriteLine("{0}", Directory.GetCreationTime(@"C:\tmp1"));
DateTime dt = new DateTime(2000, 1,1,1,1,1,1);
Directory.SetCreationTime(@"C:\tmp1",dt);
Console.WriteLine("{0}", Directory.GetCreationTime(@"C:\tmp1"));

Bu örnekle, önce C:\tmp1 dizinin oluşturulma tarihini ekrana yazdırdık. Sonra bu dizinin oluşturulma tarihini belirlemek için DateTime yapısı türünden dt nesnemizi oluşturduk. Sonraki adımda ise bu dizinin oluşturulma tarihini değiştirdik ve son adımda değisen tarihi ekrana yazdırdık.

GetCurrentDirectory( ) : Uygulamamızın (.exe dosyamızın) çalıştığı dizini verir.

Örnek :
Console.WriteLine(Directory.GetCurrentDirectory());
Bu örnekte çalışan programın hangi dizinde oldugunu ekrana yazar.
Çıktı :
C:\Documents and Settings\Oguz\Desktop\csharp\ConsoleApplication1\bin\Debug

SetCurrentDirectory( ) : Uygulamamızın (.exe dosyamızın) çalıştığı dizini mantıksal olarak değiştirir.
Örnek :
Console.WriteLine(Directory.GetCurrentDirectory());
Directory.SetCurrentDirectory(@”C:\Windows”);
Console.WriteLine(Directory.GetCurrentDirectory());

Bu örnekle, önce geçerli dizini ekrana yazdırdık. Sonraki adımda geçerli dizini değiştirip, değişen dizini ekrana yazdırdık.
Çıktı :
C:\Documents and Settings\Oguz\Desktop\csharp\ConsoleApplication1\bin\Debug
C:\Windows
GetDirectories( ) : Bir dizin altındaki tüm dizinlerin listesini verir. Geri dönüş değeri string türünden bir dizidir(string [] ).

Örnek:
string [] dirs = Directory.GetDirectories(@"C:\");
foreach(string dir in dirs)
Console.WriteLine(dir);
Bu örnekte C:\ dizinin altındaki dizinlerin listesi string türünden dirs dizisine atama yaptık. Son olarak bunları ekrana yazdırdık.
Çıktı :
C:\dizin1
C:\Documents and Settings

C:\System Volume Information
C:\tmp1
C:\WINDOWS

GetDirectoryRoot( ) : Verilen yolun (path) kök dizinini verir.
Örnek :
Console.WriteLine(Directory.GetDirectoryRoot(@"C:\windows\system32"));
Çıktı :
C:\

GetFiles( ) : Bir dizin altındaki tüm dosyaların listesini verir. Geri dönüş değeri string türünden bir dizidir(string [] ).

Örnek :
string [] files = Directory.GetFiles(@"C:\windows","*.log");
foreach (string file in files)
Console.WriteLine(file);

Bu örnekle, ilk adımda belirlediğimiz bir yolun (path) altındaki dosyaların listesini files isimli string türünden bir diziye atadık. Burada önemli olan nokta GetFiles( ) methodumuzun ikinci parametresi. Bu parametre listelenecek dosyaların uzantısını belirtir. Biz örneğimizde .log uzantılı dosyaların listelenmesini sağladık. Eğer bu parametre kullanılmazsa ( GetFiles(@”C:\windows”) gibi ) dizin altındaki bütün dosyaların (*.*) listesini alırız.

Çıktı :
C:\windows\ocmsn.log
C:\windows\Q323183.log

C:\windows\q328345.log

GetLastAccessTime( ) : GetCreationTime ( ) gibi çalışır. Dizine son erişim tarihini verir.
SetLastAccessTime( ) : SetCreationTime ( ) gibi çalışır. Dizinin son erişim tarihi değiştirir. Eğer bir hack tool yazacaksanız bu fonksiyonlar işinize çok yarayacak J

GetLogicalDrives( ) : Bilgisayardaki sürücülerin listesini verir. Geri dönüş değeri string türünden bir dizidir(string [] ).

Örnek :
string [] drives = Directory.GetLogicalDrives();
foreach(string drive in drives)
Console.WriteLine(drive);
Bu örnekle, ilk adımda bilgisayardaki sürücülerin listesini string türünden dizi olan drives nesnesine atadık(C# ta herşeyin bir nesne olduğunu biliyoruz. Diziler de System.Array sınıfından türetilmiştir!)Sonra bu listeyi ekrana yazdırdık.

Çıktı :
C:\
D:\
E:\

GetParent( ) : Bir dizinin hangi dizine ait olduğunu gösterir.
Örnek :
Console.WriteLine(Directory.GetParent(@"C:\windows\system32"));
Çıktı “C:\windows” şeklinde olacaktır. Çünkü system32 dizini C:\windows dizinin altındadır.
Çıktı :
C:\windows

Move ( ) : Bir dizini başka bir dizine taşımak için kullanılır.
Örnek :
Directory.Move(@"C:\tmp1",@"C:\tmpyedek");
Bu örnekte C:\tmp1 dizini C:\tmpyedek dizinine taşınmıştır. Sonuçta C:\tmp1 dizini yok olmuş ve C:\tmpyedek dizini oluşturulmuştur. Dikkat edilecek nokta ise tmp1 dizini içindeki herşeyle birlikte taşınır. Yani tmp1 dizinin boş yada dolu olması tşımayı etkilemez.

Şimdi ise DirectoryInfo sınıfının methodlarını ve özelliklerini (Properties) inceleyelim :

Attributes : Bu özellik ile bir dizin yada dosyanın özelliklerini öğrenmek ve değiştirmek için kullanılır.
Tür olarak FileAttributes türündendir.
Örnek :
DirectoryInfo dirInfo = new DirectoryInfo(@"C:\tmpyedek");
DirectoryInfo fileInfo = new DirectoryInfo(@"C:\tmpyedek\resim.bmp");
Console.WriteLine(dirInfo.Attributes);
Console.WriteLine(fileInfo.Attributes);

Bu örnekte, iki tane DirectoryInfo nesnesi oluşturduk. İlki bir dizin için ikincisi ise bir dosya için. Sonraki adımlarda ise dizin ve dosyanın özelliğini ekrana yazdırıyoruz.
Çıktı :

Directory
Archive

Şimdi örneğimizde ise resim.bmp isimli dosyamızı gizli hale getirelim. Bunun için dosyanın Attributes özelliğine FileAttributes.Hidden değerini atayacağız.

DirectoryInfo fileInfo = new DirectoryInfo(@"C:\tmpyedek\resim.bmp");
fileInfo.Attributes = FileAttributes.Hidden;

Sonuç olarak resim.bmp dosyamız gizli hale gelmiştir.(Dosyayı göremiyorsanız gelmiş olmalı. J) Dosyanızın Attributes özelliğine FileAttributes.Archive değerini atayarak tekrar görünür hale getirebilirsiniz.

CreationTime : Bu özellik ile bir doaya yada dizinin oluşturulma tarihini öğrenebiliriz.

Örnek:
DirectoryInfo fileInfo = new DirectoryInfo(@"C:\tmpyedek\resim.bmp");
Console.WriteLine("Dosyanın oluşturulma tarihi : " + fileInfo.CreationTime);

Çıktı :
Dosyanın oluşturulma tarihi : 09.05.2004 05:13:36

Exists : Bu özellik ile bir dizinin var olup olmadığını öğreniriz.
Örnek :
DirectoryInfo dirInfo = new DirectoryInfo(@"C:\tmpyedek");
if (dirInfo.Exists)
Console.WriteLine("Dizin var!");
else
Console.WriteLine("Dizin yok");

Extension : Bu özellik ile bir dosyanın uzantısını (extension) öğrenebiliriz.
Örnek :
DirectoryInfo fileInfo = new DirectoryInfo(@"C:\tmpyedek\resim.bmp");
Console.WriteLine(fileInfo.Extension);
Çıktı :
.bmp

FullName : Bu özellik ile bir dosyanın yada dizinin tam yolunu (full path) öğrenebiliriz.
Örnek :
DirectoryInfo fileInfo = new DirectoryInfo(@"C:\tmpyedek\resim.bmp");
Console.WriteLine(fileInfo.FullName);
Çıktı :
C:\tmpyedek\resim.bmp

LastAccessTime : Bu özellik bir dosyaya son erişim tarihini verir.
LastWriteTime : Bu özellik bir dosyanın en son ne zaman değiştiğini verir.

Name : Bu özellik bir dosya yada dizinin adını verir.
Örnek :
DirectoryInfo dirInfo = new DirectoryInfo(@"C:\tmpyedek");
DirectoryInfo fileInfo = new DirectoryInfo(@"C:\tmpyedek\resim.bmp");
Console.WriteLine(dirInfo.Name);
Console.WriteLine(fileInfo.Name);
Çıktı :
tmpyedek
resim.bmp

Parent : Bu özellik ile bir dosya yada dizinin hangi dizine ait olduğunu verir.

Root : Bir dosya yada dizinin kök dizini verir.
Create( ) : Bu method ile bir dizin oluşturabiliriz.
Örnek :
DirectoryInfo dirInfo = new DirectoryInfo(@"C:\tmpyedek\tmp1");
dirInfo.Create();

Bu örnekle, C:\ dizini altında tmpyedek dizini, tmpyedek dizini altında tmp1 dizinini oluşturduk.
CreateSubDirectory ( ) : Bu method ile belirlediğimiz bir dizin altında altdizin oluşturabiliriz.
Örnek :
DirectoryInfo dirInfo = new DirectoryInfo(@"C:\tmpyedek");
dirInfo.CreateSubdirectory("tmp1");

Bu örnekte C:\tmpyedek dizinin altında tmp1 dizinini oluşturduk. Dikkat edilecek nokta ise eğer C:\tmpyedek dizini olmasaydı, C:\tmpyedek dizini oluşturulup bu dizin içinde de tmp1 dizini oluşturulurdu.

Delete( ) : Bu method ile bir dizini ve istersek içindekilerle birlikte silebiliriz.
Örnek :
DirectoryInfo dirInfo = new DirectoryInfo(@"C:\tmpyedek");
dirInfo.Delete(true);

Bu örnekte tmpyedek dizini ve o dizin altındaki tüm dizin ve dosyalar silinecektir. Dikkat edilmesi gereken nokta Delete methoduna geçirilen true değeridir. Bu değer ile altdizinleri ve dosyaları da sil demiş oluyoruz. Eğer false değeri verilseydi ve dizin boş olmasaydı programımız hata üretirdi.

GetDirectories( ) : Bu method ile bir dizin altındaki tüm dizinlerin listesini alabiliriz.
Örnek :
DirectoryInfo dirInfo = new DirectoryInfo(@"C:\windows");
DirectoryInfo [] dirs = dirInfo.GetDirectories();
foreach(DirectoryInfo dir in dirs)
Console.WriteLine(dir.CreationTime + "\t" + dir.Name);
Bu örnekte önce hangi dizini araştıracağımızı belirliyoruz. Daha sonra DirectoryInfo türünden dirs isimli dizimizi tanımlayıp, GetDirectories methodunu kullanarak dizin isimleri dizimize atıyoruz. Son adımda ise dizinin oluşturulma tarihi ve dizin ismini birleştirerek ekrana yazıyoruz.
Çıktı :
29.10.2002 11:31:44 Media
07.05.2004 17:44:50 Microsoft.NET

29.10.2002 11:31:44 msapps

Ama biz özel isimli bir dizin ararsak ne yaparız. İşte bu noktada GetDirectories methodumuza string türünden bir parametre vererek sorunu halledebiliriz. Örneğimizde C:\Windows dizini altında, ismi “Re” ile başlayan dizinleri sıralamak istersek GetDirectories methoduna “Re*” stringini parametre olarak verebiliriz.

Örnek :
DirectoryInfo dirInfo = new DirectoryInfo(@"C:\windows");
DirectoryInfo [] dirs = dirInfo.GetDirectories("Re*");
foreach(DirectoryInfo dir in dirs)
Console.WriteLine(dir.CreationTime + "\t" + dir.Name);
Çıktı :
29.10.2002 11:41:20 Registration
29.10.2002 11:31:44 repair
29.10.2002 11:31:44 Resources

GetFiles( ) : Bu method ile bir dizin altındaki tüm dosyaların listesini alabiliriz. Bu methodun geri dönüş değeri FileInfo sınıf türündendir.

Örnek :
DirectoryInfo dirInfo = new DirectoryInfo(@"C:\windows");
FileInfo [] fInfo = dirInfo.GetFiles("*.exe");
foreach(FileInfo fi in fInfo)
Console.WriteLine("{0}-----{1} KB",fi.Name,fi.Length / 1024);

Bu örnekte C:\windows dizini altındaki dosyaların ismi ve bu dosyaların boyutu ekrana yazdırılmıstır.

GetFileSystemInfo( ) : Bu method ile bir dizin altında ne varsa onlarla ilgili bilgileri öğrenebiliriz. Geri dönüş değri FileSystemInfo sınıfı türündendir.

Örnek :

DirectoryInfo dirInfo = new DirectoryInfo(@"C:\windows");
FileSystemInfo [] fInfo = dirInfo.GetFileSystemInfos();
foreach(FileSystemInfo fi in fInfo)
{
if (fi is DirectoryInfo)
Console.WriteLine("Dir {0}", fi.FullName);
else if (fi is FileInfo)
Console.WriteLine("f {0}", fi.Name);
}

Bu örnekte ise C:\windows dizini altında ne varsa bunlar FileSystemInfo dizisine atadık. Sonra bu diziyi dolaşarak eğer bu şey DirectoryInfo ise bu bir dizin, eğer bu şey bir FileIndo ise bu bir dosya olduğunu belirledikten sonra eğer bu dizin ise başına Dir, eğer bu dosya ise başına f getirerek ekrana yazıyoruz.

MoveTo( ) : Bir dizini ve dizin içindeki altdizinleri ve dosyaları başka bir dizine taşımakta kullanılır.
Örnek :

DirectoryInfo dirInfo = new DirectoryInfo(@"C:\tmpyedek\tmp1");
dirInfo.MoveTo(@"C:\tmp");

Bu örnekte C:\tmpyedek\tmp1 dizini C:\tmp dizinine taşınmıştır.


Bu kadar yoğun bilgiden sonra sıra işe yarar bir uygulama geliştirmeye. Mesela antivürüs uygulamaları Nasıl oluyor da bütün dizinlerin içine girip bütün dosyaları bulup dolaşıyor? İşte biz de buna benzer bir dizin ağacını dolaşan uygulama geliştireceğiz. Uygulamamız verdiğimiz bir dizin altında ne var ne yok hepsini ortaya dökecek saklı gizli kalmayacak J
Bunun için yeni bir proje oluşturup aşağıdaki arayüzü hazırlayın…

image001.png

textBox un Name özelliğini txtDir, buttonun Name özelliğini btnSearch ve ListBox ın Name özelliğini lstNames ve Anchor özelliğini ise Left, Right, Top, Bottom yapın.

Şimdi dizin ağacını dolaşacak olan methodumuzu yazmaya geldi.

public void GetAllDirFiles(string Dir)
{
DirectoryInfo mainDir = new DirectoryInfo(Dir);
FileSystemInfo[] items = mainDir.GetFileSystemInfos( );
foreach (FileSystemInfo item in items)
{
if (item is DirectoryInfo)
{
lstNames.Items.Add("Dizin : " + ((DirectoryInfo)item).FullName);
GetAllDirFiles(((DirectoryInfo)item).FullName);
}
else if (item is FileInfo)
{
lstNames.Items.Add("dosya : " + ((FileInfo)item).FullName);
}

}
}
Bu methodumuz hangi dizin dolaşılacaksan o dizinin yolunu (path) parametre olarak alıyor. Daha sonra DirectoryInfo türünden nesnemizi oluşturuyoruz. Sonra GetFileSystemInfos( ) ile dizin altındaki herşeyin listesi items dizisine atanıyor. Şimdi dizimizi dolaşarak dizin ve dosyaları belirlemeye geldi.
“item is DirectoryInfo” ifadesi ile dizimizdeki elemanın dizin olduğunu, “item is FileInfo” ifadesi ile elemanın dosya olduğunu belirliyoruz. Eğer eleman dosya ise tekrar methodumuzu çağırarak o dizini tekrar dolaşıyoruz (bu method recursive bir methoddur). Eğer dizin ise başına “Dizin”, dosya ise başına “Dosya“ yazısını ekleyerek lstNames (listBox) e elemanlarımızı ekliyoruz. Şimdi sırada bu fonksiyonumuzu çağırmak var.

btnSerach’ ın onClick olayına aşağıdaki kodu ekleyelim

try // geçersiz dizin girildiğinde programın devam etmesi için kullanıyoruz
{
lstNames.Items.Clear();// yeni arama yapılacağı zaman eski bilgiler silinmesi için kullanıyoruz

GetAllDirFiles(@txtDir.Text);
}
catch
{

}

Bu uygulamayı geliştirmek sizin elinizde. Mesela listbox yerine ListView kullanarak dosya adı, tarihi, dosya büyüklüğü gibi bilgileri kullanıcıya gösterebilirsiniz. Yada textbox a çift tıklandığında FolderBrowserDialog nesenesini kullanarak hangi klasör seçileceğini kullanıcıdan isteyebilirsiniz. Artık gerisi sizin hayal gücünüze kalmış.
 

nfrat

Yeni üye
15 Ara 2006
3
0
Sağolasın dostum inşallah devamı gelir ..
Teşekkürler...
:secret :) :yaho1
 

harolit

Üye
5 Ocak 2007
85
0
abi allah razı olsun emeğine sağlık senin ellerinden öpmek lazım emeğine sağlık
 

cansın

Özel Üye
27 Nis 2008
8,788
29
Bu makalemizde C# dilini kullanarak .NET Framework’ un dosya ve dizinlerle çalışmamızı sağlayan sınıflarını inceleyeceğiz. Bunun için projemize System.IO isimuzayını (namespace) eklemiz gerekir. Bu isimuzayının altında File ve Directory sınıfları mevcuttur.

File sınıfını diskteki dosyalar (Files) , Directory sınıfını diskteki dizinler (Folders) üzerinde işlemlerimizi yapmak için kullanırız.

Dizinler :
Directory sınıfındaki bütün methodlar statictir. Yani Directory sınıfının bir methodunu kullanmak için Directory sınıfından bir nesne oluşturmak zorunda değiliz. Bu methodları kullanarak, dizin oluşturabilir (create), kopyalayabilir(copy) ya da dizinleri taşıyabiliriz(move).

Diğer yararlı bir sınıf ise DirectoryInfo sınıfıdır. Bu sınıf FileSystemInfo sınıfından türetilmiştir. FileSystemInfo sınıfını dosyalar ve dizinlerle ilgili bilgi almak için kullanırız

Bu uygulamayı geliştirmek sizin elinizde. Mesela listbox yerine ListView kullanarak dosya adı, tarihi, dosya büyüklüğü gibi bilgileri kullanıcıya gösterebilirsiniz. Yada textbox a çift tıklandığında FolderBrowserDialog nesenesini kullanarak hangi klasör seçileceğini kullanıcıdan isteyebilirsiniz.



Bilgiler için teşekkürler Bedros Sanches
 
Üst

Turkhackteam.org internet sitesi 5651 sayılı kanun’un 2. maddesinin 1. fıkrasının m) bendi ile aynı kanunun 5. maddesi kapsamında "Yer Sağlayıcı" konumundadır. İçerikler ön onay olmaksızın tamamen kullanıcılar tarafından oluşturulmaktadır. Turkhackteam.org; Yer sağlayıcı olarak, kullanıcılar tarafından oluşturulan içeriği ya da hukuka aykırı paylaşımı kontrol etmekle ya da araştırmakla yükümlü değildir. Türkhackteam saldırı timleri Türk sitelerine hiçbir zararlı faaliyette bulunmaz. Türkhackteam üyelerinin yaptığı bireysel hack faaliyetlerinden Türkhackteam sorumlu değildir. Sitelerinize Türkhackteam ismi kullanılarak hack faaliyetinde bulunulursa, site-sunucu erişim loglarından bu faaliyeti gerçekleştiren ip adresini tespit edip diğer kanıtlarla birlikte savcılığa suç duyurusunda bulununuz.