procedure TForm1.DosyaListele(root: String);
var
SR: TSearchRec;
begin
root := IncludeTrailingPathDelimiter(root);
if FindFirst(root + '*.*', faAnyFile, SR) = 0 then
try
repeat
Application.ProcessMessages;
if (SR.Attr and faDirectory) <> 0 then
begin
if (SR.Name <> '.') and (Sr.Name <> '..') then
DosyaListele(root + SR.Name);
end else
begin
if FileExists(Root + SR.Name) then
begin
Form1.ListBox1.Items.Add(Root + SR.Name);
end;
end;
until FindNext(SR) <> 0;
except
FindClose(SR);
end;
end;
procedure Klasordeki_Mp3leri_yukle(const PathName,FileName: string; const InDir: boolean );
var Rec : TSearchRec;
Path,yolu : string;
begin
if Form1.Sarki_Listesi_ListBox.ItemIndex>-1 then Form1.Sarki_Listesi_ListBox.Clear;
Path := IncludeTrailingBackslash(PathName);
if FindFirst(Path + FileName, faAnyFile - faDirectory, Rec) = 0 then
try
repeat
yolu:=Path+Rec.Name;
Form1.Sarki_Listesi_ListBox.Items.Add(Rec.Name +' Dosyanın yolu:= '+ yolu);
until FindNext(Rec) <> 0;
finally
FindClose(Rec);
end;
If not InDir then Exit;
if FindFirst(Path + '*.*', faDirectory, Rec) = 0 then
try
repeat
if ((Rec.Attr and faDirectory) <> 0) and (Rec.Name<>'.') and (Rec.Name<>'..') then
Klasordeki_Mp3leri_yukle( Path + Rec.Name, FileName, True);
until FindNext(Rec) <> 0;
finally
FindClose(Rec);
end;
try
i := 0;
while i < Dirs.Count do begin
if DirectoryExists(Dirs[i]) then
DosyaListele(Dirs[i]);
inc(i);
Dirs.Free;
end;
except
end;
Merhaba,
Yukarıdaki kodun yapmaya çalıştığı aslında aşağıdaki gibi birşey mi acaba? Yukarıda ilk döngü sonunda Dirs nesnesi Free ediliyor. Sanırım döngü dışında Free edilmesi gerekli.
try
i := 0;
while i < Dirs.Count do
begin
if DirectoryExists(Dirs[i]) then DosyaListele(Dirs[i]);
inc(i);
end;
Dirs.Free();
except
end;
Bu arada, except ile end arasına özellikle bir kod yazmadığınızı düşünüyorum. Bu anlamda hata kontrolünü DosyaListele() prosedürü/fonksiyonu içinde yapıp buradaki try..except bloğunu kaldırmanızda fayda var.
evet doğru döngü düzeldi teşşekürler ama ben sadece klasör içindekileri listelemek istiyorum alt klasörler olmadan alt klasör listelenmesin
ama hep alt klasörleride listeliyor
procedure DosyaListele(Dir:String);
var
SR : TSearchRec;
begin
if FindFirst(Dir + '*.*', faAnyFile and not faDirectory, SR) = 0 then try
repeat
Form1.ListBox1.Items.Add(dir + SR.Name);
until FindNext(SR) <> 0;
finally
FindClose(SR);
end;
end;
- Aşağıdaki gibi kullanmanız gerekli listelenecek dosya türü parametresini.
- Yazdığınız kodu try..finally bloğu içine almanızı gerektiren bir durum göremedim.
- Remark edilmiş satırı kullanma ihtiyacınız olabilir.
carsoft yazdı:alt klasör içindeki dosyaları neden listeliyor ben alt klasör içindeki dosyaları listelemek istiyorum
Son gönderdiğim örnekte dizinler listelenmemesi için gerekli düzeltmeyi yaparak göndermiştim. Siz FindFirst() fonksiyonunu aşağıdaki şekilde kullanmışsınız:
Kodu test ettiğimde "Dir" değişkeni içinde parametre olarak gönderilen dizin içindeki dosyalar listeleniyor. "Dir" değişkeninde tanımlı dizin içinde alt dizinler var ise bunlar listelenmiyor. Sizin istediğiniz bunun dışında birşey mi?
"Dir" değişkeninin sonunda Dizin ayırma karakteri yok ise hatalı listeleme alıyor olabilirsiniz.
Eğer yapmak istediğiniz bu değil ise, yapmak istediğinizi farklı bir şekilde açıklamanız/sormanız mümkün mü? Belki görsel örnekler daha anlaşılır olabilir.
procedure MyThread.Execute;
var
i: Integer;
label finish;
begin
while not terminated do
begin
try
i := 0;
while i < Dirs.Count do
begin
if DirectoryExists(Dirs[i]) then DosyaListele(Dirs[i]);
inc(i);
end;
Dirs.Free();
except
end;
finish: // Listeleme bitti
Myth.Terminate;
end;
end;