.NET'te I/O işlemleri için gelişmiş sınıflar bulunmakta.Her ne kadar kullanıcıya daha fazla kontrol imkanı vermek için bazı alt level işlemler de yapılabiliyorsa da çoğunlukla birkaç statik metodla işimizi görebiliyoruz. Şimdi nasıl dosya ya da klasör yaratılır , silinir ve herhangi bir dizin altındaki veya bir yerel diskteki dosyalar windows explorer tarzında ağaç yapısıyla nasıl gösterilir buna bakacağız. I/O işlemleri .NET' in tamamı için aynı olmakla ( System.IO , System.Web.IO değil örneğin ) beraber kolaylık olması bakımından ASP.NET üzerinde yazalım kodları. Bu kodları sadece kopyala yapıştır ile diğer .NET yapılarında örneğin WPF' te rahatlıkla kullanabiliriz. "System.IO" içerisinde kullanacağımız sınıflar şunlar olacak:
- DriveInfo
- DirectoryInfo
- FileInfo
- Directory
- File
Klasör ve Dosya Yaratma
System.IO içerisinde bulunan Directory ve File sınıfları statik metodlarıyla dosya veya klasörleri oluşturmamızı veya silmemizi sağlar.
Directory.Create(@"C:\örnekKlasör");
Directory.Delete(@"C:\örnekKlasör");
(@ işareti C#'ta stringlerden önce kullanıldığı zaman "\" karakterini kullanabilmek için "\\" yazma zorunluluğunu kaldırır ki bu da IO işlemlerinde büyük kolaylık sağlar) Eğer üzerinde çalıştığımız projenin klasöründe herhangi bir klasör oluşturmak veya silmek istiyorsak:
Directory.Create(@"Server.MapPath("örnekKlasör"));
Directory.Delete(@"Server.MapPath("örnekKlasör"));
kodunu kullanabiliriz. Dosya oluştururken veya silerken de "File" sınıfını kullanırız:
File.Create(@"C:\örnekDosya.doc")
File.Delete(@"C:\örnekDosya.doc")
veya
File.Create(@"Server.MapPath("örnekDosya"));
File.Delete(@"Server.MapPath("örnekDosya"));
Şimdi de bilgisayarda halihazırda bulunan klasörleri ve dosyaları hiyerarşik bir biçimde, ağaç yapısıyla "windows explorer" tarzında nasıl gösterebiliriz ona bakalım. Bu örnekte
- System.IO.DriveInfo
//herhangi bir yerel disk'in ismine, kullanılabilir alanına, toplam alanına vs. ulaşmamızı sağlar
- System.IO.DirectoryInfo
//herhangi bir klasörün ismine, büyüklüğüne, windows izinlerine vs. ulaşmamızı sağlar
sınıflarını kullanacağız.
Yeni bir website açıp Default.aspx (TreeView ekledikten sonra) 'in Page_Load event'inde aşağıdaki kodu yazalım.
protected void Page_Load(object sender, EventArgs e)
{
if (!Page.IsPostBack)
{
System.IO.DriveInfo drive = new System.IO.DriveInfo(@"D:\");
//D yerel diski üzerinde çalışıyoruz
TreeNode node = new TreeNode();
//dinamik olarak TreeView'in node'larını oluşturuyoruz
node.Value = drive.Name;
TreeView1.Nodes.Add(node);
//yerel diskin kendisini TreeView1'e ana node olarak ekler
klasorleriYukle(node, drive.Name);//bu recursive metoda,
// node'u ve klasörlerini ekleyeceğimiz dosyanın harddiskteki
// tam adresini veriyoruz
}
}
private void klasorleriYukle(TreeNode parent, string path)
{
System.IO.DirectoryInfo directory = new System.IO.DirectoryInfo(path);
//artık yerel diskle (DriveInfo) değil klasörlerle çalışıyoruz
try
{
// GetDirectories() ile klasörün hiyerarşik olarak altındaki
// tüm klasörleri alıyoruz
foreach (System.IO.DirectoryInfo d in directory.GetDirectories())
{
TreeNode node = new TreeNode(d.Name, d.FullName);
//üzerinde çalıştığımız klasörün ismini ve
//yerel diskteki yerini (fullName)
parent.ChildNodes.Add(node); //ini TreeView'e ekliyoruz
//üzerinde çalıştığımız klasörün tüm alt klasörleri için
//aynı metodu recursive olarak çağırıyoruz
klasorleriYukle(node, d.FullName);
}
}
catch (System.UnauthorizedAccessException e)
{
parent.Text += "(Erişim engellendi)";
}
catch (System.IO.IOException e)
{
parent.Text += "(bilinmeyen hata: " + e.Message + ")";
}
}
Yukarıda "
System.IO.DriveInfo drive = new System.IO.DriveInfo(@"D:\");" yazarak sadece D yerel diskinin içeriğini gösterdik. Eğer tüm hardiski, tüm yerel disklerle göstermek isteseydik Page_Load şu şekilde olmalıydı.
protected void Page_Load(object sender, EventArgs e)
{
if (!Page.IsPostBack)
{
foreach (System.IO.DriveInfo drive in System.IO.DriveInfo.GetDrives())
//tüm yerel diskler üzerinde çalışmak için
{
TreeNode node = new TreeNode();
node.Value = drive.Name;
if (drive.IsReady)
{
node.Text = drive.Name;
loadDirectories(node, drive.Name);
}
TreeView1.Nodes.Add(node);
}
}
}
Yukardaki işlem en az bir kaç dakika sürecektir. Program Files, Windows klasörü ve diğer dosyaların gösterilmesi için bayağı IO işlemine ihtiyaç var, çünkü.
Şimdi siteye bir GridView ekleyelim ve TreeView'den bir klasör seçtiğimiz zaman o klasördeki dosyaları isimleriyle, büyüklükleriyle, en son erişim zamanıyla vs. bu GridView'de görmek istiyoruz. Properties penceresinden TreeView'in events moduna geçelim ve "SelectedNodeChanged" eventine çift tıklayalım. Ve kod sayfasında şunu yazalım:
protected void TreeView1_SelectedNodeChanged(object sender, EventArgs e)
{
DirectoryInfo directory = new DirectoryInfo(TreeView1.SelectedNode.Value);
GridView1.DataSource = directory.GetFiles();
GridView1.DataBind();
}
System.IO kullanarak nasıl dosya, file oluşturur veya sileriz, ayrıca harddiskteki dosyaların hiyerarşik dizilimini nasıl TreeView'le görebiliriz, bunlara baktık.