14-11-2018, Saat: 08:52
Cevapların bir çoğu verilen dizin içerisinde genel bir arama, Benim kullandığım yöntem içten dışa arama önce kendi dizini sonra bir üst path'e çıkarak oradaki klasörler bulamaz ise bir üst path'e çıkarak arama.
Bu şekilde istediğim dosyayı 2 üst path'te bulması 00:00:00:009 ms sürüyor, System.IOUtils teki TDirectory sınıfı bu için biçilmiş kaftan.
açıklayıcı yazmaya çalıştım cevap veren herkese teşekkürler.
Bu şekilde istediğim dosyayı 2 üst path'te bulması 00:00:00:009 ms sürüyor, System.IOUtils teki TDirectory sınıfı bu için biçilmiş kaftan.
açıklayıcı yazmaya çalıştım cevap veren herkese teşekkürler.
unit Ufindfiles;
interface
uses
Winapi.Windows, Winapi.Messages, System.SysUtils, System.Variants,
System.Classes, Vcl.Graphics, System.Diagnostics,
Vcl.Controls, Vcl.Forms, Vcl.Dialogs, Vcl.StdCtrls;
type
TForm1 = class(TForm)
Edit1: TEdit;
Button1: TButton;
Memo1: TMemo;
procedure Button1Click(Sender: TObject);
private
{ Private declarations }
public
{ Public declarations }
end;
var
Form1: TForm1;
implementation
uses
System.Types, System.IOUtils;
{$R *.dfm}
function Findfiles(FName: String): String;
function Findfile(FFolder, FName: String): String;
var
i: integer;
Files: TStringDynArray;
begin
(*
GetFiles klasör içerisindeki dosyaların adlarını,
path ile birlikte dönüyor
'D:\Gunes\Kasım\07\OPS_GUNES_KASKO_REQUEST_EPID1453.xml'
*)
Files := TDirectory.GetFiles(FFolder);
for I := Low(Files) to High(Files) do
if ExtractFileName(Files[i]) = FName then
exit(Files[i])
end; // function Findfile
var
i, a: integer;
Directories, Directories2: TStringDynArray;
FolderParent, MFolder, MFName: String;
begin
(*
D:\Gunes\Kasım\07\OPS_GUNES_KASKO_REQUEST_EPID1453.xml
To
D:\Gunes\Kasım\07
*)
MFolder := ExtractFileDir(FName);
(*
D:\Gunes\Kasım\07\OPS_GUNES_KASKO_REQUEST_EPID1453.xml
To
OPS_GUNES_KASKO_REQUEST_EPID1453.xml
*)
MFName := ExtractFileName(FName);
(*
D:\Gunes\Kasım\07 dizininde arıyor.
*)
result := Findfile(MFolder, MFName);
if result <> '' then
exit;
(*
Bir Üst Path'deki klasörler taranıyor
GetParent D:\Gunes\Kasım\ dizinini dönüyor,
dizinindeki klasör listesini alıp tek tek klasörlerin içini tarıyor.
GetDirectories 'D:\Gunes\Kasım\01','D:\Gunes\Kasım\02'...
*)
FolderParent := TDirectory.GetParent(MFolder);
Directories := TDirectory.GetDirectories(FolderParent);
for I := Low(Directories) to High(Directories) do
begin
result := Findfile(Directories[i], MFName);
if result <> '' then
exit;
end; // for i
(*
Bir seviye daha Üst Path klasörleri taranıyor.
GetParent D:\Gunes\ dizinini dönüyor,
dizinindeki klasör listesini alıp tek tek klasörlerin içini tarıyor.
GetDirectories 'D:\Gunes\Kasım','D:\Gunes\Aralık'...
sonra ilk klasörden başlayarak döngü halinde sırayla klasörleri arıyor.
*)
FolderParent := TDirectory.GetParent(FolderParent);
Directories := TDirectory.GetDirectories(FolderParent);
for I := Low(Directories) to High(Directories) do
begin
Directories2 := TDirectory.GetDirectories(Directories[i]);
for a := Low(Directories2) to High(Directories2) do
begin
result := Findfile(Directories2[a], MFName);
if result <> '' then
exit;
end; // for a
end; // for i
end;
procedure TForm1.Button1Click(Sender: TObject);
var
Sure: TStopwatch;
Time: String;
begin
Sure := TStopwatch.StartNew;
Memo1.Lines.Add('Find: ' + Findfiles(Edit1.Text));
Time := Format('%s sürede bulundu!',
[FormatDateTime('hh:nn:ss:zzz', Sure.ElapsedMilliseconds / MSecsPerDay)]);
Memo1.Lines.Add('Time: ' + Time);
end;
end.

