Klasör içinde dosya arama sürekli döngü problemi

Delphi'de kod yazma ile ilgili sorularınızı bu foruma yazabilirsiniz.
carsoft
Üye
Mesajlar: 138
Kayıt: 01 Ağu 2014 12:27

Klasör içinde dosya arama sürekli döngü problemi

Mesaj gönderen carsoft »

Bu kod klasör içindeki dosyaları listeliyor fakat durmuyor sürekli arıyor döngüye giriyor

Kod: Tümünü seç

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;
Kullanıcı avatarı
SimaWB
Üye
Mesajlar: 1316
Kayıt: 07 May 2009 10:42
Konum: İstanbul
İletişim:

Re: Klasör içinde dosya arama sürekli döngü problemi

Mesaj gönderen SimaWB »

kodunuzda 4 tane begin var ama 5 tane end var.
------
Bu mesajı yok sayabilirsiniz :?
En son SimaWB tarafından 20 Eki 2016 01:59 tarihinde düzenlendi, toplamda 1 kere düzenlendi.
There's no place like 127.0.0.1
carsoft
Üye
Mesajlar: 138
Kayıt: 01 Ağu 2014 12:27

Re: Klasör içinde dosya arama sürekli döngü problemi

Mesaj gönderen carsoft »

begin end 'lerde sorun yok baktım tekrar ama sürekli döngüye giriyor
Kullanıcı avatarı
sabanakman
Kıdemli Üye
Mesajlar: 3077
Kayıt: 17 Nis 2006 08:11
Konum: Ah bi Antalya olaydı keşke (Ankara)

Re: Klasör içinde dosya arama sürekli döngü problemi

Mesaj gönderen sabanakman »

Klasör yapınıza göre nasıl döngüye girmesi gerekiyorsa o kadar döngüye giren bir kod bu. Ben bir sıkıntı bulamadım, doğru çalışmakta kodlar.
Şaban Şahin AKMAN
_________________
Derin olan kuyu değil kısa olan iptir. - .
carsoft
Üye
Mesajlar: 138
Kayıt: 01 Ağu 2014 12:27

Re: Klasör içinde dosya arama sürekli döngü problemi

Mesaj gönderen carsoft »

sürekli döngüde anlamadım şu şekilde kullanıyorum Dirs TStringList' dir

Kod: Tümünü seç

try
        i := 0;
        while i < Dirs.Count do begin
              if DirectoryExists(Dirs[i]) then
                 DosyaListele(Dirs[i]);
                 inc(i);
                 Dirs.Free;
        end;
    except
    end;
carsoft
Üye
Mesajlar: 138
Kayıt: 01 Ağu 2014 12:27

Re: Klasör içinde dosya arama sürekli döngü problemi

Mesaj gönderen carsoft »

bu şekilde çağırınca neden döngüye giriyor peki procedur'de problem yok
Lord_Ares
Üye
Mesajlar: 1070
Kayıt: 15 Eki 2006 04:33
Konum: Çorlu

Re: Klasör içinde dosya arama sürekli döngü problemi

Mesaj gönderen Lord_Ares »

Merhaba, bir klasör içndeki mp3 leri bulup gösterirken kullandığım kodu paylaşmak istedim belki işinize yarayabilir.

Kod: Tümünü seç

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;
            
Kullanım şeklide

Kod: Tümünü seç

Klasordeki_Mp3leri_yukle('D:\Müzik' ,'*.mp3', true );
ertank
Kıdemli Üye
Mesajlar: 1653
Kayıt: 12 Eyl 2015 12:45

Re: Klasör içinde dosya arama sürekli döngü problemi

Mesaj gönderen ertank »

carsoft yazdı:sürekli döngüde anlamadım şu şekilde kullanıyorum Dirs TStringList' dir

Kod: Tümünü seç

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.

Kod: Tümünü seç

  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.
carsoft
Üye
Mesajlar: 138
Kayıt: 01 Ağu 2014 12:27

Re: Klasör içinde dosya arama sürekli döngü problemi

Mesaj gönderen carsoft »

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

Kod: Tümünü seç

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;
ertank
Kıdemli Üye
Mesajlar: 1653
Kayıt: 12 Eyl 2015 12:45

Re: Klasör içinde dosya arama sürekli döngü problemi

Mesaj gönderen ertank »

- 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.

Kod: Tümünü seç

procedure DosyaListele(Dir:String);
var
  SR: TSearchRec;
begin
  // Form1.ListBox1.Items.Clear()
  if FindFirst(Dir + '*.*', faAnyFile - faDirectory, SR) = 0 then 
  begin
    repeat
      Form1.ListBox1.Items.Add(dir + SR.Name);
    until FindNext(SR) <> 0;
    FindClose(SR);
  end;
end;
carsoft
Üye
Mesajlar: 138
Kayıt: 01 Ağu 2014 12:27

Re: Klasör içinde dosya arama sürekli döngü problemi

Mesaj gönderen carsoft »

alt klasör içindeki dosyaları neden listeliyor ben alt klasör içindeki dosyaları listelemek istiyorum
ertank
Kıdemli Üye
Mesajlar: 1653
Kayıt: 12 Eyl 2015 12:45

Re: Klasör içinde dosya arama sürekli döngü problemi

Mesaj gönderen ertank »

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:

Kod: Tümünü seç

if FindFirst(Dir + '*.*', faAnyFile and not faDirectory, SR) = 0 then try
Benim gönderdiğim kod ise aşağıdaki gibi:

Kod: Tümünü seç

if FindFirst(Dir + '*.*', faAnyFile - faDirectory, SR) = 0 then 
Acaba benim son gönderdiğim kodu denediniz ve hala dizin isimleri listeleniyor mu?
carsoft
Üye
Mesajlar: 138
Kayıt: 01 Ağu 2014 12:27

Re: Klasör içinde dosya arama sürekli döngü problemi

Mesaj gönderen carsoft »

evet sizinkini denedim zaten hala alt dizindeki klasör içerigini listeliyor
ertank
Kıdemli Üye
Mesajlar: 1653
Kayıt: 12 Eyl 2015 12:45

Re: Klasör içinde dosya arama sürekli döngü problemi

Mesaj gönderen ertank »

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.
carsoft
Üye
Mesajlar: 138
Kayıt: 01 Ağu 2014 12:27

Re: Klasör içinde dosya arama sürekli döngü problemi

Mesaj gönderen carsoft »

Senin gönderdigin kodu thread içinden çağırıyorum ama alt klsörlerdeki dosyaları listeliyor
Şöyleki.

Kod: Tümünü seç

procedure DosyaListele(Dir:String);
var
  SR: TSearchRec;
begin
  // Form1.ListBox1.Items.Clear()
  if FindFirst(Dir + '*.*', faAnyFile - faDirectory, SR) = 0 then
  begin
    repeat
      Form1.ListBox1.Items.Add(dir + SR.Name);
    until FindNext(SR) <> 0;
    FindClose(SR);
  end;
end;
bu şekilde çağırıyorum

Kod: Tümünü seç

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;
Cevapla