Selam Dostlar,
Bu gönderimde sizlerle ilk kapsamlı C# programımı paylaşmak istiyorum. İlk gönderimimde belirttiğim rötuşlar da büyük ölçüde bitti. Yapılacak daha çok şey var tabii ki, ama bu haliyle de istenen sonuçlar elde edilebilmektedir. Buna beta sürümü diyorum zaten, bir sonraki sürümü inşallah WPF olarak hazırlıycam.
Herşey annemin “Oğlum bilgisayarımda birbirinin aynısı birsürü dosya var, şunları bi temizle bakalım” demesiyle başladı. Bu tür mükerrer(duplike) dosyaları bulan ve silen programlardan iki tanesini kurdum, ilki onlarca dosya buldu(toplam alanı 2 GB kadar) ama silmek için ücretli(PRO) versiyona geçmemi istedi, yani hiç sildirmedi. İkincisi ise hiç bulamadı 🙂 İkisini de kurduğum gibi kaldırdım, ve bunu acaba C# üzerinde yapabilir miyim diye düşündüm ve birkaç gün içinde bu kadar kolay olacağını düşünmediğim ana kodu yazdım. Ancak bunu daha görsel, daha işlevsel ve gerek görsellik gerek kod açısından daha zarif hale getirmem 2 ayımı aldı, tabiki bilfiil 2 ay değil, fırsat buldukça bakmaya çalıştım.
Neyse uzun lafın kısası programın beta sürümü şuan hazır ve buradan indirebilirsiniz. Öneri ve yorumlarınızı bekliyorum. (Not: Programı çalıştırdığınızda Windowsun guvenlik aracı engelleyebilir, bunun için çıkan pencerede Ek bilgi dugmesine basip devam edebilirsiniz.)
Genel Bakış
Giriş
İlk açılış ekranımız aşağıdaki gibidir. Burada sizden 3 ana bölümde seçme yapmanız bekleniyor.
1-Kriter Seçimi
Arama kriterini sizin yerinize hazır olarak seçtim. Temel olarak dosyanın değiştirilme tarihinin ve boyutunun aynı anda eşit olması dosyaların da büyük ihtimalle eşit olması anlamına gelecektir.(ilk başta oluşturma tarihi olarak yola çıktım ama sonra yaptığım testlerde bir dosyayı bir klasörden başka klasöre taşıyınca oluşturma tarihinin hemen o anın tarihine döndüğünü gördüm, o yüzden değiştirilme tarihini kullanmak daha mantıklı geldi)
Dosya adı alanını da ekledim ama bazen dosyaların isimlerini değiştirebiliyoruz, o yüzden bunları kaçırmış oluruz, ancak siz yine de “ben dosya adına göre de ararım” diyorsanız bunu da seçebilirsiniz.
Bir de Süper Arama seçeneği var. Yukarıda boyut ve tarih seçmeniz durumunda büyük ihtimalle aynı olacaktır demiştim, ama kesin olarak değil. Tesadüfen ikisi de aynı olduğu halde dosyalar farklı olabilir. Ancak bu süper arama seçeneği ise neredeyse kesine yakın(matematiksel olarak hata payı 10 üzeri 32’de 1) bir şekilde tarama yapar. Bu tarama türü, kesin eşleştirmeyi sağlayacak tek yöntem olan dosyayı “Byte Byte okumaya” göre daha efektiftir ama yine de ilk tarih-boyut taramasına göre daha yavaş çalışacaktır. Tarama sonunda her dosya için 29-B4-1C-B3-54-F3-14-19-16-EE-0D-6A-F5-73-56-9F-DA-3F-D5-47 gibi bir hashcode üretilir ve bunlar karşılaştırılır.
Örnek bir klasörde tarama yapıp kendi PC’niz için hızını farklı kombinasyonlar için test edebilirsiniz.
NOT: Birbirinin aynısı olup da bir şekilde boyutu faklı olan dosyalar var olabilir. Ör: iki şarkı da aynı şarkıcının aynı şarkısıdır ama biri CD’den mp3’e çevrilirken biri Youtube’dan dönüştürülmüş olabilir ve bir şekilde boyutları farklı çıkmıştır. Zaten böyle durumları ne benim ne de başka bir programın yakalaması mümkün değildir.
2-Klasör Seçimi
Hangi klasörlerde tarama yapmak istiyorsanız onları buraya ekleyin. Genelde müzik, resim veya video klasörlerini taramak iyi fikir olacaktır ancak isterseniz tüm diskinizi bile tarayabilirsiniz. Listeye birden fazla klasör ekleyebilirsiniz.
3-Dosya türleri(uzantı seçimi)
Hangi tür dosyaları aramak istiyorsanız onları seçtiğin kutudur.
Tüm seçimleri yapıp “Taramaya Başla” düğmesine bastıktan sonra ilerleme çubuğunun bir süre hareketsiz kaldığını göreceksiniz(bu süreç klasör tarama sürecidir), akabinde(süresi tarattığınız klasördeki dosya sayısına göre değişir) dosyaların karşılaştırılması sürecine geçilir ki burada ilerleme çubuğunda %sel gelişimin hareketlendiğini göreceksiniz.
4-Dosya boyutu(Opsiyonel)
Minimum ve maksimum dosya boyutu vererek tarama listenizi daraltabilirsiniz.
Çıktı
Tarama sonrasında ekran görüntüsü aşağıdaki gibi olacaktır. Resim dosyaları için bulunan mükerrer dosyanın kendisini ve orijinalinin aynı olup olmadığını da test etme imkanınız da olmaktadır.(2.fazda müzik ve video dosyaları için de aynı seçenek olacaktır) Bu arada orijinal dosya olarak ilk gördüğü dosyayı almaktadır. Sonra gördüklerini mükerrer olarak ele alır. SİL dediğinizde bu mükerrerleri silmiş olursunuz. Halbuki programın orijinal olarak belirlediği dosya çok alakasız, yedeğin de yedeği bir klasörde yer alıyor olabilir. Bir sonraki versiyonda hem orjinali hem de mükerrerleri TreeView şeklinde göstermeyi planlıyorum, böylece orijinal olarak belirlenen dosyayı silmek için işaretleyip, mükerreri seçmeyebilirsiniz.
Örnek vermek gerekirse benim laptopta yaptığım bu tarama yaklaşık 15 sn sürmüştür. ama Süper tarama seçerek yaparsam 10 dk civarı sürüyor.
Neler kullandım (Programcılara Özel)
Programın kendisi yerine yazdığım kodla ilgilenen kişilere, kullandığım kod parçaları hakkında da bilgi vermek isterim.
- İlk olarak global field olarak aşağıdaki dictionary’leri tanımladım, açıklamaları zaten yanlarında var.
- Görmüş olacağınız üzere ProgressBar ve Backgroundworker kullandım.
- Uzantıları aşağıdaki gibi bir List içine aldım ve tarama sonrasında foreach ile her dosya türü için tarama yaptım.
- Boyut-tarih-ad kriterlerine göre tarama sonucunu döndürmek için aşağıdaki metodu oluşturdum
- Klasör taraması yapmak için ilk başta Directory.GetFiles((string)lstKlasorler.Items[i], x, SearchOption.AllDirectories) şekline ilerlemeye çalıştım ancak erişim yetkimin olmadığı klasörler karşıma çıkınca program hata veriyordu, ve inanın sandığınızdan çok sayıda böyle klasör var PC’nizde, tamam resim klasörü gibi klasörlerde yok ama tüm disk taraması yapmak istediğiniz karşınıza kesin çıkacaktır. Bu nedenle küçük bir Google araştırması sonucunda bir kod bulup aşağıdaki gibi kendi ihtiyacıma göre revize ettim.
Kodum toplamda yorumlarla birlikte 657 satır. İlk gönderimde belirttiğim gibi C# dünyasına yeni adım atmış sayılırım, eminim şuan yolu uzatarak yaptığım bazı yerler olabilir, 2.fazı yaparken bir yandan da bunları daha kısa nasıl yaparım diye de düşüneceğim.
İlgilenen olursa tüm kodu da paylaşabilirim.
Saygı ve Sevilerimle