C# Diskteki Boş Alan Miktarını Bulmak

Yazdığımız uygulamalar veya windows service’lerde, bilgisayarın disklerindeki boş alan miktarını bulmamız ve bu miktara göre çeşitli karar mekanizmalarını çalıştırmamız gerekebilir.

Yapmamız gereken ilk iş, bilgisayara bağlı bulunan disklerin listesine erişmek.

DriveInfo sınıfının GetDrives() methodundan geriye, detaylı bilgilerine erişebileceğimiz disklerin listesi döner.

Basit bir foreach döngüsü ile bu liste üzerinden tüm disklere erişebiliriz;

foreach (DriveInfo disk in DriveInfo.GetDrives()) { }</pre>

Döngü içerisinde, disk’in adına ulaşmak için DriveInfo sınıfının Name özelliğini kullanırız.

C# ile bilgisayarınızdaki diskleri listelemek yazımda yazdığım şekilde, DriveInfo sınıfının IsReady özelliği ile diskin kullanılabilir olduğunu kontrol ederiz.

Son olarak;

DriveFormat özelliği ile diskin Dosya Sistemi Formatını (File System Format) AvailableFreeSpace özelliği ile diskin boş alan miktarını (byte cinsinden) TotalFreeSpace özelliği ile diskin toplam boş alan miktarını (byte cinsinden) TotalSize özelliği ile diskin toplam kapasitesini (byte cinsinden)

öğrenebiliriz.

using System;
using System.IO;

public static class Program
{
    public static void Main(string[] args)
    {
        foreach (DriveInfo disk in DriveInfo.GetDrives())
        {
            Console.WriteLine("Disk: {0}", disk.Name);

            if (disk.IsReady)
            {
                Console.WriteLine("Toplam Alan:\t\t{0}", disk.TotalSize.FormatDosyaBoyutu());
                Console.WriteLine("Boş Alan Miktarı:\t{0}", disk.AvailableFreeSpace.FormatDosyaBoyutu());
            }

            Console.WriteLine("**********");
        }

        Console.ReadLine();
    }
}

Boş Alan Miktarı bilgisi ekrana byte cinsinden sayı olarak yazılacağı için pek okunaklı değildir.

C# Windows tarzı dosya boyutu formatlayıcı yazımda yazdığım dosya boyutu formatlayıcı kodunu da ekleyelim;

public enum Boyutlar
{
    byte,
    kilobyte,
    megabyte,
    gigabyte,
    terabyte,
    petabyte
}

public static string FormatDosyaBoyutu(this long DosyaBoyutu)
{
    Boyutlar BoyutTanim = Boyutlar.byte;

    while (Math.Round((decimal)DosyaBoyutu) >= 1000)
    {
        DosyaBoyutu /= 1024;
        BoyutTanim++;
    }

    return string.Format("{0}\t{1}", DosyaBoyutu.ToString("f2"), BoyutTanim);
}

Böylece örnek kodun tamamı;

using System;
using System.IO;

public static class Program
{
    public static void Main(string[] args)
    {
        foreach (DriveInfo disk in DriveInfo.GetDrives())
        {
            Console.WriteLine("Disk: {0}", disk.Name);

            if (disk.IsReady)
            {
                Console.WriteLine("Toplam Alan:\t\t{0}", disk.TotalSize.FormatDosyaBoyutu());
                Console.WriteLine("Boş Alan Miktarı:\t{0}", disk.AvailableFreeSpace.FormatDosyaBoyutu());
            }

            Console.WriteLine("**********");
        }

        Console.ReadLine();
    }

    public enum Boyutlar
    {
        byte,
        kilobyte,
        megabyte,
        gigabyte,
        terabyte,
        petabyte
    }

    public static string FormatDosyaBoyutu(this long DosyaBoyutu)
    {
        Boyutlar BoyutTanim = Boyutlar.byte;

        while (Math.Round((decimal)DosyaBoyutu) >= 1000)
        {
            DosyaBoyutu /= 1024;
            BoyutTanim++;
        }

        return string.Format("{0}\t{1}", DosyaBoyutu.ToString("f2"), BoyutTanim);
    }
}


Yukarıdaki kodun çıktısı aşağıdaki *gibi* olacaktır;

![Boş Alan Hesaplayıcı](/assets/uploads/2010/09/BosAlanHesaplayici.png "Boş Alan Hesaplayıcı")

C# Windows tarzı dosya boyutu formatlayıcı

Eğer uygulamalarınızda dosya sistemindeki dosyalar veya dizinler ile uğraşıyorsanız (listeleme, filtreleme, vs.) büyük ihtimalle dosya veya dizinlerin boyutlarını hespalayan bir yönteminiz vardır.

Genellikle (kolay olduğundan ötürü) byte cinsinden dosya boyutunu 1000’e (bin) böler kilobyte cinsinden veya 1.000.000’a (milyon) böler megabyte cinsinden karşılığını buluruz.

Fakat Windows işletim sisteminde dosya veya dizinlerin boyutları en yakın birime göre hesaplanır ve gösterilir.

Küçük dosyalar byte, kilobyte veya megabyte cinsinden gösterilirken, daha büyük dosyalar gigabyte hatta terabyte cinsinden gösterilebiliyor.

Eğer biz de uygulamamızda dosya boyutlarını Windows tarzında göstermek istiyorsak, öncelikle birimleri elde etmemize yarayacak bir enum tanımlamalıyız;

public enum Boyutlar { byte, kilobyte, megabyte, gigabyte, terabyte, petabyte }</pre>

Daha sonra, parametre olarak noktalı rakam alan, geriye string döndüren bir method tanımlamalıyız;

public static string FormatDosyaBoyutu(decimal DosyaBoyutu)
{
}

FormatDosyaBoyutu method’unda, önce Boyutlar enum‘ından bir örnek oluşturacağız ve byte değerini içermesini sağlayacağız;

Boyutlar BoyutTanim = Boyutlar.byte;

Daha sonra bir döngü aracılığıyla, DosyaBoyutu değişkeni 1000’e bölünebildiği sürece BoyutTanim değişkeninin bir üst birimi içermesini sağlayacağız;

while (Math.Round(DosyaBoyutu) >= 1000)
{
    DosyaBoyutu /= 1024;
    BoyutTanim++;
}

Son olarak, method’dan geriye DosyaBoyutu değişkenin virgülden sonra 2 hane içeren ve doğru birimi gösteren değeri döndürmesini sağlayacağız;

return string.Format("{0}\t{1}", DosyaBoyutu.ToString("f2"), BoyutTanim);

Dosya Boyutu Formatlayıcı

Örnek kodun tamamı;

using System;
using System.Text;

namespace DosyaBoyutuFormatlayici
{
    class Program
    {
        public enum Boyutlar
        {
            byte,
            kilobyte,
            megabyte,
            gigabyte,
            terabyte,
            petabyte
        }

        public static void Main(string[] args)
        {
            Console.WriteLine(FormatDosyaBoyutu(0));
            Console.WriteLine(FormatDosyaBoyutu(10));
            Console.WriteLine(FormatDosyaBoyutu(200));
            Console.WriteLine(FormatDosyaBoyutu(3000));
            Console.WriteLine(FormatDosyaBoyutu(40000));
            Console.WriteLine(FormatDosyaBoyutu(500000));
            Console.WriteLine(FormatDosyaBoyutu(6000000));
            Console.WriteLine(FormatDosyaBoyutu(70000000));
            Console.WriteLine(FormatDosyaBoyutu(800000000));
            Console.WriteLine(FormatDosyaBoyutu(9000000000));
            Console.WriteLine(FormatDosyaBoyutu(10000000000));
            Console.WriteLine(FormatDosyaBoyutu(200000000000));
            Console.WriteLine(FormatDosyaBoyutu(3000000000000));
            Console.WriteLine(FormatDosyaBoyutu(40000000000000));
            Console.WriteLine(FormatDosyaBoyutu(500000000000000));
            Console.WriteLine(FormatDosyaBoyutu(6000000000000000));
            Console.WriteLine(FormatDosyaBoyutu(70000000000000000));
            Console.WriteLine(FormatDosyaBoyutu(800000000000000000));
            Console.WriteLine(FormatDosyaBoyutu(9000000000000000000));
            Console.WriteLine(FormatDosyaBoyutu(10000000000000000000));

            Console.ReadLine();
        }

        public static string FormatDosyaBoyutu(decimal DosyaBoyutu)
        {
            Boyutlar BoyutTanim = Boyutlar.byte;

            while (Math.Round(DosyaBoyutu) >= 1000)
            {
                DosyaBoyutu /= 1024;
                BoyutTanim++;
            }

            return string.Format("{0}\t{1}", DosyaBoyutu.ToString("f2"), BoyutTanim);
        }
    }
}


Euler - 5

Euler serisinin beşinci yazısında, Project Euler’in 5. sorusunu çözeceğiz;

Orijinal soru; 2520 is the smallest number that can be divided by each of the numbers from 1 to 10 without any remainder.

What is the smallest positive number that is evenly divisible by all of the numbers from 1 to 20?

Türkçesi; 1’den 10’a kadar olan sayılara kalansız bölünebilen en küçük sayı 2520’dir.

1’den 20’ye kadar olan rakamların tamamına kalansız bölünebilen en küçük sayı kaçtır?

Önce siz çözmeyi deneyin, çözemezseniz ;

using System; using System.Collections.Generic; using System.Linq; using System.Collections;

static class Program { static void Main(string[] args) { var Sonuc = Enumerable.Range(1, 20).Carpanlar().Aggregate(1, (item, number) => item * number);

    Console.WriteLine(Sonuc);

    Console.Read();
}

private static IEnumerable&lt;int&gt; Carpanlar(this IEnumerable&lt;int&gt; liste)
{
    if (!liste.Any())
        yield break;

    int carpan = liste.First();

    if (carpan == 0)
        yield break;

    yield return carpan;

    foreach (int item in (from item in liste.Skip(1) select (item % carpan == 0) ? item / carpan : item).Carpanlar())
        yield return item;
} }

C# FolderBrowserDialog seçili dizini değiştirmek

.Net ile FolderBrowserDialog sınıfı sayesinde, Dizin Seçme Dialog Penceresi oluşturabiliyoruz.

OpenFileDialog sınıfını kullanırak Dosya Seçme Dialog Kutusu açtıracağımız zaman, varsayılan dizini InitialDirectory özelliği ile belirleyebiliyoruz.

FolderBrowserDialog sınıfının InitialDirectory özelliği olmadığı için, varsayılan dizini bu özelliği ayarlayarak belirleyemiyoruz.

Fakat yardımımıza SelectedPath özelliği yetişiyor;

FolderBrowserDialog dialog = new FolderBrowserDialog(); dialog.Description = “Lütfen aşağıdaki listeden bir dizin seçiniz.”; dialog.RootFolder = Environment.SpecialFolder.Desktop; dialog.SelectedPath = @”C:\Program Files”; if (dialog.ShowDialog() == DialogResult.OK) { Console.WriteLine(dialog.SelectedPath); }

Örnek kodu çalıştırdığımızda aşağıdaki ekranı görmelisiniz;

CSharp Browse Folder Dialog

Bu kodda ne yanlış var? – 6

Bir kitabevi için web uygulaması geliştiriyorsunuz. Yaptığınız analize dayanarak, uygulamanın veritabanını aşağıdaki gibi tasarladınız;

Bu kodda ne yanlış var? - 6 / Veritabanı Modeli

Veritabanı modelinize göre, her kitabın sıfır veya daha fazla yazarı olabilir, her yazarın sıfır veya daha fazla kitabı olabilir.

Toplam Kitap Adedi ve Toplam Yazar Adedi sorularına cevap verebilmek için, aşağıdaki sorguyu yazdınız;

SELECT DISTINCT COUNT(Yazarlar.YazarID) AS ToplamYazarAdedi, COUNT(Kitaplar.KitapID) AS ToplamKitapAdedi FROM Yazarlar FULL JOIN YazarKitaplari YK ON Yazarlar.YazarID = YK.YazarID FULL JOIN Kitaplar ON YK.KitapID = Kitaplar.KitapID

Problem, rakamların beklediğinizden yüksek çıkması.

Sizce problem nedir ve nasıl düzeltebiliriz?

Engin Polat hakkında

Senior Software Engineer, @Microsoft

Ada ve Ege'nin babası ;)

Kategoriler

İstatistik

Makale Adedi: 484

Creative Commons Lisansı