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?

C# string sınıfı ve özellikleri

.Net string sınıfı uygulamalarımızda sıklıkla kullandığımız sınıflardan biridir.

.Net 1.1 versiyonundan itibaren gelişme göstermesine rağmen, hala bazı fonksiyonlarının eksik olduğunu veya tam anlamıyla kullanılmadığını düşünüyoum.

Bu makalemde, string sınıfının çok bilinmeyen veya çok kullanılmayan özelliklerine ve methodlarına değinmeye çalışacağım.

String değişkeni tekrar eden karakterler ile doldurmak

String değişkeni tekrar eden karakterler ile doldurmak için, String sınıfının constructor’ını kullanmak gerekir.

Örneğin, bir string değişkeni 50 adet nokta (.) karakteri ile doldurmak istiyorsak;

string degisken = new string(‘.’, 50);</pre>

String değişkenin boş olduğunu kontrol etmek

String değişkenin değer içerip içermediğini belirlemek için string.Empty ve boş tırnaklar (“”) ile karşılaştırmamız gerekir.

if (degisken != null && degisken != "")
{
}

Alternatif olarak bu iki karşılaştırmayı yapmak yerine, .Net 2.0 ile gelen string.IsNullOrEmpty static fonksiyonunu kullanabiliriz;

if (!string.IsNullOrEmpty(degisken))
{
}

String.Empty ve boş tırnaklar (“”) arasındaki fark

İnternette çeşitli sitelerde, string.Empty ve boş tırnaklar (“”) arasında seçim yapmak için yazılmış makalelere rastlayabilirsiniz.

Aslında yapılan onlarca test gösteriyor ki, performans açısından bakıldığında string.Empty ve boş tırnaklar (“”) arasında önemsenmeyecek kadar küçük bir fark vardır.

Yapılan testler milyarlarca string değişken üzerinde yapılmasına rağmen ortaya çıkan fark göz ardı edilebilecek kadar düşük seviyededir.

String değişkenin içeriğini ters çevirmek

Bir string değişkenin içeriğini ters çevirmek için çeşitli algoritmalara internet üzerinden ulaşabilir veya kendi algoritmanızı geliştirebilirsiniz.

Kodun temizliği, hız, Unicode karakter setleri ile sorunsuz çalışabilmesi açısından benim en çok kullandığım yöntem şudur;

public static string Reverse(this string s)
{
    char[] charArray = s.ToCharArray();
    Array.Reverse(charArray);
    return new string(charArray);
}

String karşılaştırma

String değişkenin değeri null olabileceği için, karşılaştırma operatörünü (==) kullanmaktan kaçınmamız gerekir.

Bunun yerine String sınıfının static Compare method’unu kullanmamız daha doğrudur.

Static Compare method’u sayesinde null referans’ları doğru şekilde karşılaştırabilir, büyük-küçük harf duyarlılığını yoksayabilir, farklı Culture’daki değerleri karşılaştırabiliriz.

if (String.Compare(degisken1, degisken2, true) == 0)
{
}

Büyük-Küçük harf duyarlılığı olmayan IndexOf

String sınıfının IndexOf method’u büyük-küçük harf duyarlıdır. Büyük-Küçük harf duyarlılığı olmadan IndexOf method’unu kullanmak istiyorsak, System.Globalization namespace’inde yeralan CompareInfo sınıfı’nın IndexOf method’unu kullanabiliriz;

using System.Globalization;

string degisken1 = "Uygulamalarımızın olmazsa olmaz unsurları değişkenlerdir";
string degisken2 = "OLMAZ";

CompareInfo karsilastirma = CultureInfo.InvariantCulture.CompareInfo;
int i = karsilastirma.IndexOf(degisken1, degisken2, CompareOptions.IgnoreCase);


**string ve String farkı**

MSDN'deki String sınıfı ile alakalı bir sayfadan alıntı;

*"The keyword string is simply an alias for the predefined class System.String." – C# Language Specification 4.2.3*

Türkçesi;

*"string anahtar kelimesi basitçe, System.String sınıfının takma adıdır." – C# Language Specification 4.2.3*

Engin Polat hakkında

Chief Architect, Microsoft RD, Microsoft MVP

Ada ve Ege'nin babası ;)

Kategoriler

İstatistik

Makale Adedi: 458

Creative Commons Lisansı