Konuyu Oyla:
  • Derecelendirme: 0/5 - 0 oy
  • 1
  • 2
  • 3
  • 4
  • 5
Dosya Bulma (Algoritmik Soru Serisi)
#1
Merhabalar

Bir fonksiyona ihtiyacım oldu ve az biraz uğraşarak hallettim gayet hızlı çalışıyor ancak acaba daha farklı bir bakışla daha farklı fonksiyonlar çıkacak mı siz olsanız hangi yolu izlerdiniz görmek istedim.

Bir Klasörüm var "C:\\Delphi"

Bu dizin içerisinde Yıl\Ay\Gün bazlı klasörler ve bu klasörlerde dosyalar var format önemli değil var sayalım hepsi *.log uzantılı...

Örnek,
TSm3N.png


Elimizde bir değer var , Olması muhtemel dizin, yani bu şekilde "C:\Delphi\2018\Kasım\04\delphix1453.log" eğer dosya gerçekten bu dizindeyse aynısını geri dönüyoruz.

Ancak bu dosya bir gün öncesine veya 7 , 15 gün öncesine de ait olabilir. dolayısı ile 
"C:\Delphi\2018\Kasım\04" dizininde,
"C:\Delphi\2018\Kasım\02" dizininde,
"C:\Delphi\2018\Ekim\28" dizininde dahi olabilir ancak maximum aralık 15 gün varsayalım dılayısı ile 1 path yukarı çıkmamız yeterli.

Dosyayı en hızlı ve kusursuz doğrulukta bulacak bir fonksiyon istiyorum.

Not: Kusursuz doğruluktan kastım eğer string fonksiyonum boş değilse , dönen stringi Fileexiste soktuğumda true dönmesi şart.

Bu konudaki doğru yanlış gördüğüm tüm çabaya puan vereceğim.
WWW
Cevapla
#2
Ben Kendim yazacak olsam sanırım aşağıdaki gibi yapardım.

1- Thread ile ilgili dizindeki tüm *.log dosyalarını bulur ve adresleri ile birlikte bir dosyaya yada TStringList'e toplardım.
2- Thread Sonunda ilgili dosya ya da TStringList'e ilgili dosyayı arar ve bulduğumda fileexit yapar ve Doğruluğunu Teyit ederdim.

yada

Thread kullanarak tüm klasörlerde tek tek ilgili dosyayı arardım ve bulduğum an geri dosya yolunu dönerdim.
(Aşağıdaki arama Kodunu Kullanırdım ama biraz makyaj lazım tabi.),

procedure GetAllFilesEM(Path, ExtMask: String; List: TStrings;
  SubFolder: Boolean);
var
 Attrib, k: Integer;
 Search: TSearchRec;
begin
 Attrib := faArchive + faReadOnly + faHidden;

 if Path[Length(Path)] <> '\' then Path := Path + '\';

 with TStringList.Create do
 try
   CommaText := ExtMask;

   for k := 0 to Count - 1 do
   if FindFirst(Path + '*.' + Strings[k], Attrib, Search) = 0 then
     repeat
       List.Add(AnsiUpperCase(Path + Search.Name));
     until FindNext(Search) <> 0;

   FindClose(Search);
 finally Free end;

 if SubFolder then
 begin
   if FindFirst(Path + '*.*', faDirectory, Search) = 0 then
   begin
     repeat
       if ((Search.Attr and faDirectory) = faDirectory) and
         (Search.Name[1] <> '.') then
         GetAllFilesEM(Path + Search.Name, ExtMask, List, SubFolder);
     until FindNext(Search) <> 0;

     FindClose(Search);
   end;
 end;
end; {Popov}

procedure TForm1.Button1Click(Sender: TObject);
begin
  GetAllFilesEM('c:\programme', 'exe', ListBox1.Items, True);
end;






Dediklerimi kod olarak denemedim ama ilk bu yolları denerdim.
Cevapla
#3
Uzun bir fonksiyon olur belki ama tek yolu şu görünyor. Delphi dizinideki alt klasörleri listboxyıl'a ekle (yıl klasörlerini) sonra listboxyılın birinci satırdaki klasörün içindekileri listboxay'a ekle sonra listboxay'ın birinci satırdakinin içindekileri de listboxgün'e ekle listboxgün'ün içindekileri de listboxdosyaya'ekle eğer listboxdosya içinde aradığın dosya yoksa listboxgün'ün sıfırıncı satırını sil ve sıfırıncı satıra gelen yeni günü tekrar listele ve tekrar ara eğer listboxgün'de item kalmazsa yani bütün günler biterse listboxay'da sıfırıncı satırı sil v.bb şekilde devam edecek bir döngü oluşturulabilir.

Böyle uzun bir döngü olmasının sebebi alt klasör sayısının çok olması Delphi>>yıllar>> aylar>> günler>> dosyalar.

şöyle bir kolaylık da hatırlıyorum. ilgili dosyayı tek bir komutla delphi klasörünün altında arayabiliyorduk bir algoritmaya ihtiyaç duymadan öyle hatırlıyorum ama tabiki biraz araştırmak gerekiyor bulamadım.
Cevapla
#4
Fikir vermesi açısından; klasör ve içindeki dosya adları SQL sorgularını kolaylaştıracak şekilde işlenerek memtable veya herhangi bir veritabanına yüklenir. Filtreleme ve arama işlemleri için SQL in yetenekleri kullanılabilir.
Cevapla
#5
Kod lazım kod Smile

Alıp çalıştıracağım benimkinden hızlı mı yavaş mı ?
hız ölçeceğim Wink
WWW
Cevapla
#6
o zaman şöyle yapalım. Bende o klasör yapısında log dosyaları yok. tek tek oluşturmayalım. ziple gönder. birde kendi exe ni gönder. basit bir uygulama olarak bizde neler yapabiliyoruz görelim Smile
Cevapla
#7
Bendeki dosyalar kvkk tabi gönderemem , döngü ile oluşturabilirsiniz. Wink
WWW
Cevapla
#8
(12-11-2018, Saat: 21:18)yhackup Adlı Kullanıcıdan Alıntı: Bendeki dosyalar kvkk tabi gönderemem , döngü ile oluşturabilirsiniz. Wink

Peki Aradığımız Dosya Tek mi ? aynısı başka klasör içinde olma ihtimali var mı ?
Cevapla
#9
(12-11-2018, Saat: 21:23)SercanTEK Adlı Kullanıcıdan Alıntı:
(12-11-2018, Saat: 21:18)yhackup Adlı Kullanıcıdan Alıntı: Bendeki dosyalar kvkk tabi gönderemem , döngü ile oluşturabilirsiniz. Wink

Peki Aradığımız Dosya Tek mi ? aynısı başka klasör içinde olma ihtimali var mı ?
Kesinlikle yok dosya isimleri benzersiz.
WWW
Cevapla
#10
Hocam kısıtlı bilgim ile aşağıdaki uygulamayı hazırladım. Kodları vermeyeceğim şimdilik. Test için exe yi ekliyorum. Kontrol Edermisiniz ? Yavaş kaldı ise Farklı çözümlerim var elbet. 

Test için Dizini Seçin. Dosya Adı ve Uzantısını Yazın. Bul Butonuna Basın. Küçük Büyük Harf Duyarlılığı yoktur.

AramaTarama.rar -  627 KB
Cevapla


Konu ile Alakalı Benzer Konular
Konular Yazar Yorumlar Okunma Son Yorum
  Soru : Interface mi, Abstract Class mı? uparlayan 3 3.926 24-08-2023, Saat: 20:15
Son Yorum: veteran
  Windows Mesajlaşma Sistemi Hk. Soru (+10 Puan) Tuğrul HELVACI 26 18.458 06-10-2022, Saat: 18:47
Son Yorum: Master_Crazy



Konuyu Okuyanlar: 1 Ziyaretçi