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,
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.
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.
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.
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.
Kod lazım kod
Alıp çalıştıracağım benimkinden hızlı mı yavaş mı ?
hız ölçeceğim

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

Bendeki dosyalar kvkk tabi gönderemem , döngü ile oluşturabilirsiniz.

(12-11-2018, Saat: 21:18)yhackup Adlı Kullanıcıdan Alıntı: [ -> ]Bendeki dosyalar kvkk tabi gönderemem , döngü ile oluşturabilirsiniz. 
Peki Aradığımız Dosya Tek mi ? aynısı başka klasör içinde olma ihtimali var mı ?
(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. 
Peki Aradığımız Dosya Tek mi ? aynısı başka klasör içinde olma ihtimali var mı ?
Kesinlikle yok dosya isimleri benzersiz.
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