Makale Özeti

C# İle Dosyalar Ve Klasörler Üzerinde Nasıl İşlem Yapacağımızı Bir Uygulama Yaparak Öğreniyoruz.

Makale

Merhaba arkadaşlar;

C# ile klasörler ve dosyalar üzerinde yapabileceğimiz işlemlere bakacağız.Kullanıcağımız classları biraz inceleyelim.

DriveInfo :Bilgisayarın sürücülerinin bilgisini tutar. Örnek : C , D ,CD ROM , USB

Directory : Klasörler ile ilgili işlemlerin yapıldığı static bir classtır. Örnek : Ekleme , Silme , Düzenleme

DirectoryInfo : Klasörün özelliklerinin tutulduğu classtır.Örnek : Oluşturulma Tarihi , Adı , İçindekiler

File : Dosyalar ile ilgili işlemlerin yapıldığı static bir classtır. Örnek : Ekleme , Silme , Düzenleme

FileInfo : Dosyanın özelliklerinin tutulduğu classtır. Örnek : Oluşturulma Tarihi , Adı , Yolu , İçindekiler

Bu konuyu incelemek için Windows Expoler tarzı bir uygulama yapacağız.

Form yapımız aşağıdaki gibi olacak.

1 Treeview (Klasörler listelenecek)
1 Listview (Dosyalar listelenecek) Sahip olacağı columnlar : icon için boş column,Dosya adı ,Dosya boyutu, oluşturulma tarihi , değiştirlme tarihi ,Son ulaşım tarihi,Extension
1 Imagelist (Dosya iconları barındırılacak)
1 Groupbox
1 Button (Dosya Silme işlemi için)
1 Contexmenuscript (Klasör ekleme ve silme işlemi için)

 

Kodlamamıza geçelim.Bütün klasörlerimiz sürücülerin altında bulunduğu için öncelikle treeview e sürücüleri eklememiz gerekiyor.Bu işlemi ayrı bir metot olarak yazacağız ve form load kısmına ekleyeceğiz.

Daha sonrada kullanabilmemiz için ayrı bir metot olarak oluşturuyoruz.

public void GetMainFolder()
{
lstPrograms.Items.Clear();// Listviewimizin içini boşaltıyoruz.
treeDosyalar.Nodes.Clear();// Treeviewimizin içini boşaltıyoruz.
DriveInfo[] drivers = DriveInfo.GetDrives();// GetDrivers metodu bize bilgisayarda bulunan sürücüleri bir dizi halinde geri döndürür.
foreach (DriveInfo driveInfo in drivers)// Foreach döngüsü ile dizinin içindeki elemanları dönüyoruz.
{
if (!driveInfo.IsReady) continue;//Eğer sürücü dolu işe cd romsa içinde cd varsa usb ise usb takılıysa IsReady değeri true olur.Burada eğer true değilse bir sonraki sürücüye geçmesini sağlıyoruz.
TreeNode driveNode = new TreeNode//Sürücülerimiz aynı zamanda brer klasör olduğu için onları treeview ekleyeceiz.Bunun için bir treenode oluşturuyoruz.
{
Name = driveInfo.DriveType.ToString(),//Name ine o sürücünün tipini atıyoruz Örnek : Fixed , CD ROM vb.
Text = driveInfo.RootDirectory.ToString(),// Texti yanı görünecek değerine sürücünü yolunu atıyoruz C ise C , D ise D Gözükecektir.
Tag = driveInfo.RootDirectory,// Tag değerinede DirectoryInfo tipinde bilgilerini atıyoruz.
ContextMenuStrip = directoryMenu // Node umuza contextmenumüzü ekliyoruz bununla ilgili kodlamaları sonra yapacağız.
};
/*
driveInfo.RootDirectory.GetFiles().Any() GetFiles Metodu O klasör altında olan dosyaları getirir.Any Metodu ise içinde hiç eleman olup olmadığını kontrol eder varsa false yoksa true döndürür.
* Treeview eğer altında bir node yoksa yanında + işaretini çıkarmaz o yüzden eğer alt klasörleri varsa altına + işaretinin gözükmesi için bir tane boş node ekliyoruz.
*/
if (driveInfo.RootDirectory.GetDirectories().Any()) driveNode.Nodes.Add(new TreeNode());
treeDosyalar.Nodes.Add(driveNode);// ve Nodumuzu treeviewe ekliyoruz.
}
}

Ve bu metodu Form_Loada ekliyoruz.

private void Form1_Load(object sender, EventArgs e)
{
GetMainFolder();
}

 

Şimdi yapmamız gerekn işlem treeviewde + ya tıklandığında alt klasörleri nodeun altına ekleyeceğiz.Bunun için treeviewin AfterExpand eventini kullanacağız.Bu event nodeun yanındaki + işaretine tıklanıp altındaki nodelar açıldıktan sonra çalışır.Biz bu eventte altındaki eklediğimiz boş nodeu silip alt klaösrlerini ekleyeceğiz.

Kodlarımız :

private void treeDosyalar_AfterExpand(object sender, TreeViewEventArgs e)
{
TreeNode selectedNode = e.Node; // Açılan nodemuzu değişkene atıyoruz.
selectedNode.Nodes.Clear(); // Nodeun altındaki alt nodeları temizliyoruz.
DirectoryInfo directoryInfo = selectedNode.Tag as DirectoryInfo;
// nodun Tag özelliğine atadığımız Klasörün DirectoryInfo Nesnesini alıyoruz.
DirectoryInfo[] subFolders = directoryInfo.GetDirectories();
// GetDirectories ile klasörün altındaki klasörleri bir diziye atıyoruz.
foreach (DirectoryInfo subFolder in subFolders) // dizideki elemanları tek tek inceliyoruz.
{
try
{
/*
bu kodlarımızı neden try catch içine alıyoruz açıklayalım.Bazı dosyaların güvenlik düzeyleri o klasöre ulaşmamızı engeller.Bu gibi durumlarda UnauthorizedAccessException hatasını fırlatır onun için
try catch içine alıyoruz.
*/
TreeNode subfolderNode = new TreeNode(subFolder.Name)//alt klasörler için birer treenode oluşturuyoruz.Parametre olarakta klasörün adını veriyoruz.
{
Tag = subFolder,//Tag değerine DirectoryInfo bilgileri aktarıyoruz.
ContextMenuStrip = directoryMenu//Contextmenu olarakte directoryMenuyu atıyoruz.
};
/*
.GetFiles().Any() klasörün altında başka klasörler varmı diye kontrol ediyoruz.
*/
if (subFolder.GetDirectories().Any()) subfolderNode.Nodes.Add(new TreeNode());
selectedNode.Nodes.Add(subfolderNode);//Ana klasöre alt klasörümüzü ekliyoruz.
}
catch (UnauthorizedAccessException exception)
{// Eğer klasörün güvenlik ayarları ulaşmamızı engelliyorsa bu kodlar çalışacaktır.
MessageBox.Show(
"Ulaşılmak istenen klasörün güvenlik ayarları ulaşılmasını engelliyor.\nHata : " +
exception.Message + "\nWeb Site : " + exception.HelpLink, exception.GetType().Name,
MessageBoxButtons.OK, MessageBoxIcon.Error);
}
catch (Exception exception)
{// Herhangi bir hatada bu kodlar çalışacaktır.
MessageBox.Show("Bir hata oluştu.\nHata : " +
exception.Message + "\nWeb Site : " + exception.HelpLink, exception.GetType().Name,
MessageBoxButtons.OK, MessageBoxIcon.Error);
}
}
}

Sıra geldi nodea tıklandığında içindeki Dosyaların listviewde listelenmesine.Ama bunun için öncelikle yapmamız gerekn imagelistimizi listviewimizin smallimageliste atıyoruz.Burada dosyaların iconlarını tutacağız.

Bu işlem için treeviewin NodeMouseClick Eventini kullanıyoruz.

Kodlar :

private void treeDosyalar_NodeMouseClick(object sender, TreeNodeMouseClickEventArgs e)
{
lstPrograms.Items.Clear();//Listviewimizin içini temizliyoruz.
FileInfo[] files = (e.Node.Tag as DirectoryInfo).GetFiles();//GetFiles() sayesinde Klasörün altınta bulunan dosyaları diziye atıyoruz.
foreach (FileInfo fileInfo in files)//Dosyaları tek tek dönüyoruz.
{
/*

Icon tipinde bir dğeişkenimiz var eğer dosyanın iconu varsa fileIcon a iconunu atıyouz yoksa default bir icon atıyoruz.
* ?? ifadesi eğer null sa anlamı katar

*/
System.Drawing.Icon fileIcon = Icon.ExtractAssociatedIcon(fileInfo.FullName) ?? SystemIcons.WinLogo;

/*

Her dosya uzantısının kendine ait bir iconu vardır.O yüzden imagelistimizde icon bilgisini dosya uzantısına göre tutuyoruz.
imglst.Images.ContainsKey(fileInfo.Extension) ile verdiğimiz uzantının iconun ekli olup olmadığını kontrol ediyoruz eğer ekli değilse
imglst.Images.Add(fileInfo.Extension, fileIcon) ile imagelistimize ekliyoruz.
*/
if (!imglst.Images.ContainsKey(fileInfo.Extension)) imglst.Images.Add(fileInfo.Extension, fileIcon);
ListViewItem listViewItem = new ListViewItem();//bir list view oluşturuyoruz.
listViewItem.ImageIndex = imglst.Images.IndexOfKey(fileInfo.Extension);//imglst.Images.IndexOfKey(fileInfo.Extension) metodu sayesinde verdiğimiz uzantının imagelistteki index değerini atıyoruz.
listViewItem.SubItems.Add(fileInfo.Name);// Dosya adını subItem olarak ekliyoruz.
listViewItem.SubItems.Add(fileInfo.Length.ToString());// Dosya boyutunu (byte) subItem olarak ekliyoruz.
listViewItem.SubItems.Add(fileInfo.CreationTime.ToShortDateString());// Oluşturulma zamanını subItem olarak ekliyoruz.
listViewItem.SubItems.Add(fileInfo.LastWriteTime.ToShortDateString());// Son değiştirilme tarihini subItem olarak ekliyoruz.
listViewItem.SubItems.Add(fileInfo.LastAccessTime.ToShortDateString());// Son Kullanılma tarinini subItem olarak ekliyoruz.
listViewItem.SubItems.Add(fileInfo.Extension);// Dosya uzantısını subItem olarak ekliyoruz.
listViewItem.Tag = fileInfo;// Tag değerine de FileInfo nesnesini ekliyoruz.
lstPrograms.Items.Add(listViewItem);// son olarakta listviewItemı listviewimize ekliyoruz.
}
lstPrograms.AutoResizeColumns(ColumnHeaderAutoResizeStyle.ColumnContent);//Bu AutoResizeColumns metodu Column boyutlarını yeniden düzenler biz içeriğe göre boyutlandırmasını istiyoruz.
}


Son durum :

Şimdi geldi klasör ekleme ve silme işlemlerine bunun için oluşturduğumuz contextmenuscripti kullanacağız.

Önce sorun yaratmaması için treeviewin MouseUp eventine şu kodu yazıyoruz.

private void treeDosyalar_MouseUp(object sender, MouseEventArgs e)
{
treeDosyalar.SelectedNode = treeDosyalar.GetNodeAt(e.X, e.Y);// Verilen kordinatlardaki treenode seçili node olur.
}

//Şimdi sıra ekle komutumuzda.Click olayına şu kodları yazıyoruz.

private void ekleToolStripMenuItem_Click(object sender, EventArgs e)
{
DirectoryInfo directoryInfo = treeDosyalar.SelectedNode.Tag as DirectoryInfo; // Seçili nodedaki DirectoryInfo nesnesini bir değişkene alıyoruz.
/*
Ne yazık ki C# da ınputbox yok onun için refenrance larımıza Microsoft.VisualBasic dllini ekliyoruz.
*/
string newFolder = Microsoft.VisualBasic.Interaction.InputBox("Klasör Adı", "Klasör Adını Girin", "Yeni Klasör");// Burada istediğimiz klasör adını alıyoruz.</strong></code>
int number = 0;
string path = "";

while (true)
{
/*
Bu döngünün amacı nedir ? eklemek istediğimiz klasör adı var ise yanına sayı ekleyip tekrar ekleriz.
*/
string newFolder2 = newFolder;
if (number &gt; 0) newFolder2 += " (" + number + ")";// Eğer number 0 dan büyük ise o sayıyı klasör adının yanına ekler
path = directoryInfo.FullName + "\\" + newFolder2;//Klasörün tam yolunu alıyoruz.
if (!Directory.Exists(path)) break;// Exists Metodu ile klasörğn olup olmadığını kontrol ediyoruz.Eğer dosya yoksa bize false döner ve bizde eğer yoksa ekleyebileceği için döngüden çıkıyoruz ama eğer varsa sayı arttırıp klasör adının yanına ekliyoruz.
number++;
}
Directory.CreateDirectory(path);//CreateDirectory : Verilen yolda klasörü oluşturur.
GetMainFolder();//Treeviewi tekrar 0dan çekiyoruz.

}

Birde silme işlemini yapıyoruz.Kodlarımız.

private void silToolStripMenuItem_Click(object sender, EventArgs e)
{
DirectoryInfo directoryInfo = treeDosyalar.SelectedNode.Tag as DirectoryInfo;//Seçili olan nodedaki DirectoryInfo Nesnesini bir dğeişkene atıyoruz.
Directory.Delete(directoryInfo.FullName);//Delete metoduna tam yolunu vererek klasörü siliyoruz
GetMainFolder();//Treeviewi tekrar 0dan çekiyoruz.
}

Şimdi sıra geldi dosyaları silme işine peki bunu neden button ile yapıyoruz çünkü listviewin ListViewItem Bazlı contextmenu ozelliği yok.Button kodlarımıza bakalım.

private void btnSil_Click(object sender, EventArgs e)
{
FileInfo fileInfo = lstPrograms.SelectedItems[0].Tag as FileInfo;//listviewde seçili olan itemin tagindeki FileInfo bilgisini alıyoruz.
File.Delete(fileInfo.FullName);//Dosyanın yolunu veriyoruz ve dosyayı siliyoruz.
GetMainFolder();//Treeviewi tekrar 0dan çekiyoruz.
}

Şimdi bilgilerin görüntülenmesi için ufak bir <strong>Info</strong> Formu yapacağız. Form yapımız şu şekilde :

Formumuzun yapıcı metotları şu şekilde olacak.

public Info(FileInfo file)
{
fileInfo = file;
InitializeComponent();
}

public Info(DirectoryInfo file)
{
directoryInfo = file;
InitializeComponent();
}

Info_Load Metoduna bu kodları yazıyoruz.

private FileInfo fileInfo;
private DirectoryInfo directoryInfo;
private void File_Info_Load(object sender, EventArgs e)
{
if (directoryInfo == null)//Eğer directoryinfosu null ise demekki FileInfo yapıcı metodu kullanılmıştır.Ve bilgilerimizi ona göre dolduruyoruz.
{
lblContains.Visible = false;//Bu özellik DirectoryInfo Nesnesi için olduğundan FileInfoda gizliyoruz.
label5.Visible = false;//Bu özellik DirectoryInfo Nesnesi için olduğundan FileInfoda gizliyoruz.
RegistryKey rkFileType = Registry.ClassesRoot;//Regestry de classesRootualıyoruz.
rkFileType = rkFileType.OpenSubKey(fileInfo.Extension);//Dosyauzantısına göre Registrysini alıyoruz.
lblType.Text = rkFileType.GetValue("") != null ? rkFileType.GetValue("").ToString() : "";//Buradanda bu uzantının bilgisini alıyoruz.
lblSize.Text = fileInfo.Length.ToString();
lblName.Text = fileInfo.Name;
lblModified.Text = fileInfo.LastWriteTime.ToLongDateString();
lblLocation.Text = fileInfo.DirectoryName;
lblCreated.Text = fileInfo.CreationTime.ToLongDateString();
lblAccesDate.Text = fileInfo.LastAccessTime.ToLongDateString();
}
else
{
lblType.Text = "Klasör";
lblSize.Text = directoryInfo.GetFiles().Sum(x =&gt; x.Length).ToString();
lblName.Text = directoryInfo.Name;
lblLocation.Text = directoryInfo.FullName;
lblCreated.Text = directoryInfo.CreationTime.ToLongDateString();
lblAccesDate.Text = directoryInfo.LastAccessTime.ToLongDateString();
lblModified.Text = directoryInfo.LastWriteTime.ToLongDateString();
lblContains.Text = string.Format("{0} Dosya , {1} Klasör", directoryInfo.GetDirectories().Count(), directoryInfo.GetFiles().Count());
}
}

Ve kaydet buttonuna bu kodları yazıyoruz. Ve Kaydet buttonun Dialogresult Diğerini Ok Yapıyoruz.

private void btnKaydet_Click(object sender, EventArgs e)
{
if (directoryInfo == null)//Eğer bu Form FileInfo İçinse
File.Move(fileInfo.FullName, fileInfo.FullName.Replace(fileInfo.Name, "") + lblName.Text);//Move komutu normalde dosyayı taşımamıza yarar ancak aynı yere farklı isimle taşıyınca doğal olarak sadece ismini değiştirmiş oluyoruz.
else
Directory.Move(directoryInfo.FullName, directoryInfo.FullName.Replace(directoryInfo.Name, "") + lblName.Text);//Move komutu normalde dosyayı taşımamıza yarar ancak aynı yere farklı isimle taşıyınca doğal olarak sadece ismini değiştirmiş oluyoruz.
this.Close();
}

Şimdi bu formu nasıl aacağız ? Treeviewde <strong>DoubleClick</strong> Olayı ile Listviewde <strong>MouseClick</strong> olayı ile yapacağız kodlar aşağıdaki gibi.

private void lstPrograms_MouseClick(object sender, MouseEventArgs e)
{
ListViewItem listViewItem = lstPrograms.GetItemAt(e.X, e.Y);// Belirtilen kordinatlardaki Listviewıtemı alıyoruz.
if (listViewItem != null)// ListviewItem değeri null mu diye kontrol ediyoruz.
{
listViewItem.Selected = true;//Seçili kılıyoruz
DialogResult dr = new Info(listViewItem.Tag as FileInfo).ShowDialog();// ListviewItemin tagindeki FileInfo sınıfını formun parametresine veriyoruz ve showdialog ile açıyoruz ve geri dönen değeri bir değişkene atıyoruz.
if (dr == DialogResult.OK) GetMainFolder();// eğer dönen değer OK ise verileri tekrar çekiyoruz.
}
}

private void treeDosyalar_NodeMouseDoubleClick(object sender, TreeNodeMouseClickEventArgs e)
{
DialogResult dr = new Info(e.Node.Tag as DirectoryInfo).ShowDialog();// ListviewItemin tagindeki DirectoryInfo sınıfını formun parametresine veriyoruz ve showdialog ile açıyoruz ve geri dönen değeri bir değişkene atıyoruz.
if (dr == DialogResult.OK) GetMainFolder();// eğer dönen değer OK ise verileri tekrar çekiyoruz.
}


Ve programımız bu kadar...

Proje :

DosyaKlasorIslemleri_Full.rar