DirectoryExists ile tüm alt dizinleri kontrol etme

Delphi'de kod yazma ile ilgili sorularınızı bu foruma yazabilirsiniz.
Cevapla
Lord_Ares
Üye
Mesajlar: 1070
Kayıt: 15 Eki 2006 04:33
Konum: Çorlu

DirectoryExists ile tüm alt dizinleri kontrol etme

Mesaj gönderen Lord_Ares »

Merhaba,
Klasör (Dizin) arama konusunda takılıp kaldım. Forumdaki her örneği inceledim fakat gördüğüm belli tek bir dizin içindeki klasörün DirectoryExists functionu ile varlığı kontrol edilmiş. Oysa benim yapmaya çalıştığım verdiğim bir ana dizin ve tüm alt dizinler içinde klasör var mı..( Dosya varmı değil , klasör var mı )

C:\Şarkılar\yerli\Gülşen\2016pop
Aranacak Dizin = D:\Mp3

Yukarıdaki örneğe göre D:\Mp3 dizininde bir arama gerçekleştirmek. Buna göre şöyle bir dizin araması yapmak istiyorum.
///D:\Mp3 dizininde " \yerli\Gülşen\2016 " dizinlerinin herbirini tek tek kontrol etmek.
1) Yerli klasörü varmı ? yoksa oluştur.
2) Yerli klasörü varsa içinde Gülşen klasörü var mı ? yoksa oluştur
3) Gülşen klasörünün içinde 2016pop varmı ? yoksa oluştur.


Bunu en kestirme yoldan ForceDirectories('D:\Mp3\yerli\Gülşen\2016pop') kullanarak yapabiliyorum. Buradaki sorun eğer Gülşen klasörü ana dizinde de varsa ( D:\Gülşen\2016pop yani direk D: sürücüsünde varsa ) gidip D:\Mp3\Yerli klasörünün içine tekrar oluşturur. Bunun kontrolünü nasıl sağlarım.
Veya en azından verilen bir dizin ve alt dizinleri içinde aranan klasör var mı , yoksa oluştur şeklinde nasıl yapabilirim
Kullanıcı avatarı
freeman35
Admin
Mesajlar: 2380
Kayıt: 12 Haz 2003 04:05
Konum: merkez camii yanı

Re: DirectoryExists ile tüm alt dizinleri kontrol etme

Mesaj gönderen freeman35 »

Delphi versiyonuna göre fark edebilir.

Kod: Tümünü seç

uses System.IOUtils, System.type;
var
  LList: TStringDynArray;
  I: Integer;
  LSearchOption: TSearchOption;
begin
    LSearchOption := TSearchOption.soAllDirectories;
  try
      LList := TDirectory.GetDirectories('c:\Program Files\Common Files\', '*', LSearchOption);
  except
    { Catch the possible exceptions }
    MessageDlg('Incorrect path or search mask', mtError, [mbOK], 0);
    Exit;
  end;
  MMO_1.Clear;
  for I:=0to Length(LList) -1 do MMO_1.Lines.Add(LList[I]);
ZAGOR TENAY TÜRK'tür... TÜRK kalacak...
Zoru başarırım, İmkansız zaman alır
FreeMan 35.5

Soru sormaya üşenmiyorsan, sorunun çözümünü yazmaya da üşenme !!!
dicle_gsm
Üye
Mesajlar: 19
Kayıt: 26 Oca 2016 06:52
Konum: Mardin
İletişim:

Re: DirectoryExists ile tüm alt dizinleri kontrol etme

Mesaj gönderen dicle_gsm »

Resim

Burdaki Linki kontrol edebilirsiniz.

http://delphi.about.com/od/vclusing/a/findfile.htm
Lord_Ares
Üye
Mesajlar: 1070
Kayıt: 15 Eki 2006 04:33
Konum: Çorlu

Re: DirectoryExists ile tüm alt dizinleri kontrol etme

Mesaj gönderen Lord_Ares »

freeman35, örneğiniz için çok teşekkür ederim. Fakat ben bundan, klasör varsa true yada false değeri döndürmedim.
dicle_gsm yazdı:Resim

Burdaki Linki kontrol edebilirsiniz.

http://delphi.about.com/od/vclusing/a/findfile.htm
Cevap için teşekkürler, fakat o örnek D:\mp3 dediğinizde malesef işe yaramıyor. Benim amacım verdiğim bir klasör ismini (!!Dosya değil..) verdiğim bir dizin (örneğin D:\ ) ve Dizin içindeki tüm al klasörlerde arayıp varsa true yoksa false değeri döndürmek.
dicle_gsm
Üye
Mesajlar: 19
Kayıt: 26 Oca 2016 06:52
Konum: Mardin
İletişim:

Re: DirectoryExists ile tüm alt dizinleri kontrol etme

Mesaj gönderen dicle_gsm »

CMD Komutlarıyla daha hızlı ve olumlu sonuç alınabilir sanırım

Kod: Tümünü seç

function IsWinNT: boolean;
var
  OSV: OSVERSIONINFO;
begin
  OSV.dwOSVersionInfoSize := sizeof(osv);
  GetVersionEx(OSV);
  result := OSV.dwPlatformId = VER_PLATFORM_WIN32_NT;
end;


var
  Buffer: array[0..10096] of Char;
  si: STARTUPINFO;
  sa: SECURITY_ATTRIBUTES;
  sd: SECURITY_DESCRIPTOR;
  pi: PROCESS_INFORMATION;
  newstdin, newstdout, read_stdout, write_stdin: THandle;
  exitcod, bread, avail: Cardinal;
  Str: string;
begin

  Result:= '';
SetCurrentDir(ExtractFilePath(Application.ExeName));
  if IsWinNT then
  begin
    InitializeSecurityDescriptor(@sd, SECURITY_DESCRIPTOR_REVISION);
    SetSecurityDescriptorDacl(@sd, true, nil, false);
    sa.lpSecurityDescriptor := @sd;
  end
  else sa.lpSecurityDescriptor := nil;
  sa.nLength := sizeof(SECURITY_ATTRIBUTES);
  sa.bInheritHandle := TRUE;
  if CreatePipe(newstdin, write_stdin, @sa, 0) then
  begin
    if CreatePipe(read_stdout, newstdout, @sa, 0) then
    begin
      GetStartupInfo(si);
      with si do
      begin
        dwFlags := STARTF_USESTDHANDLES or STARTF_USESHOWWINDOW;
        wShowWindow := SW_HIDE;

        hStdOutput := newstdout;
        hStdError := newstdout;
        hStdInput := newstdin;
      end;
      Fillchar(Buffer, SizeOf(Buffer), 0);
      GetEnvironmentVariable('COMSPEC', @Buffer, SizeOf(Buffer) - 1);
      StrCat(@Buffer,PChar(' /c ' + cmd));
      if CreateProcess(nil, @Buffer, nil, nil, TRUE, CREATE_NEW_CONSOLE, nil, nil, si, pi) then
      begin
        Str:= #13;
        WriteFile(write_stdin,PChar(Str)^,Length(Str),bread,nil);
        repeat
          PeekNamedPipe(read_stdout, @Buffer, SizeOf(Buffer) - 1, @bread, @avail, nil);
          if bread > 0 then
          begin
            Fillchar(Buffer, SizeOf(Buffer), 0);
            ReadFile(read_stdout, Buffer, bread, bread, nil);
            Result:= Result + String(PChar(@Buffer));
          end;
          GetExitCodeProcess(pi.hProcess, exitcod);
        until (exitcod <> STILL_ACTIVE) and (bread = 0);
      end;
      CloseHandle(read_stdout);
      CloseHandle(newstdout);
    end;
    CloseHandle(newstdin);
    CloseHandle(write_stdin);
  end;
  end;

Kod: Tümünü seç

var
 s : String;
begin
   s:=Shell('dir /ad /b /s /d d:\MP3');
   Memo1.Lines.Add(s);
   if Pos('d:\MP3\a\b\c', s)>0  then
   ShowMessage('a\b\c klasörü bulundu') else
   ShowMessage('a\b\c klasörü bulunmadı');
end;

Resim
En son dicle_gsm tarafından 19 Eki 2016 11:59 tarihinde düzenlendi, toplamda 1 kere düzenlendi.
Kullanıcı avatarı
freeman35
Admin
Mesajlar: 2380
Kayıt: 12 Haz 2003 04:05
Konum: merkez camii yanı

Re: DirectoryExists ile tüm alt dizinleri kontrol etme

Mesaj gönderen freeman35 »

Lord_Ares yazdı:freeman35, örneğiniz için çok teşekkür ederim. Fakat ben bundan, klasör varsa true yada false değeri döndürmedim.
LList verdiğin klasör ün altındaki tüm klasörlerin listesini veriyor. Hangi şarta göre istiyorsan true false işini sen yap. en basit, LList içeriği boşsa verdiğin başlangıç klasörünün altında klasör yok demektir muhtemelen. yada bir döngü ile ara gibi. Bu örneği berlin help inden almıştım.
ZAGOR TENAY TÜRK'tür... TÜRK kalacak...
Zoru başarırım, İmkansız zaman alır
FreeMan 35.5

Soru sormaya üşenmiyorsan, sorunun çözümünü yazmaya da üşenme !!!
Lord_Ares
Üye
Mesajlar: 1070
Kayıt: 15 Eki 2006 04:33
Konum: Çorlu

Re: DirectoryExists ile tüm alt dizinleri kontrol etme

Mesaj gönderen Lord_Ares »

Paylaşımlarınız için hepinize teşekkürler. Amacım klasör aramak dosya değil !! verilen bazı örneklerde "Test" adında bir arama gerçekleştirirseniz sonuç olarak adı test olan klasör ve dosyaları (Örnek test.mp3) buluyor. Ben sadece Klasör varmı diye arama yaptırmaya çalışıyorum.
Konuyu biraz daha araştıracağım.
Kullanıcı avatarı
greenegitim
Üye
Mesajlar: 713
Kayıt: 28 Nis 2011 10:33
Konum: İstanbul

Re: DirectoryExists ile tüm alt dizinleri kontrol etme

Mesaj gönderen greenegitim »

Kod: Tümünü seç

procedure EnumFolders(root: string; folders: TStrings);


        procedure Enum(dir: string);
        var
        SR: TSearchRec;
        ret: Integer;
  begin
        if dir[length(dir)] <> '\' then
        dir := dir + '\';
        ret := FindFirst(dir + '*.*', faDirectory, SR);
        if ret = 0 then
              try
                 repeat
                      if ((SR.Attr and faDirectory) <> 0) and (SR.Name <> '.') and
                      (SR.Name <> '..') then
                      begin
                      folders.add(dir + SR.Name);
                      Enum(dir + SR.Name);
                      end;
                      ret := FindNext(SR);
                   until
              ret <> 0;
              finally

        FindClose(SR)
        end;
  end;

 begin
    Folders.Clear;
    if root <> emptyStr then
      Enum(root);
  end;

Kod: Tümünü seç

  DireList:=TStringList.Create;
   EnumFolders('d:\', DireList);

   DireList.SaveToFile(ExtractFilePath(ParamStr(0))+'\folderlist.txt');


Mücadele güzelleştirir!
Lord_Ares
Üye
Mesajlar: 1070
Kayıt: 15 Eki 2006 04:33
Konum: Çorlu

Re: DirectoryExists ile tüm alt dizinleri kontrol etme

Mesaj gönderen Lord_Ares »

Greenegitim , paylaşım için teşekkürler. Bu örnek belli bir dizindeki klasörleri listeliyor. Dolayısı ile tam ihtiyacımı karşılamıyor ama bu yapıyı kurcalarsam sanırım olabilir.

Function Klasör_VarMı (AranacanYer:String; Aranacak_Klasör_Adı:String ):boolean;

Bu fonksiyona "C:\Şarkılar\yerli\Gülşen\2016pop" satırlarındaki her bir dizin adını Functiona geçerek arama gerçekleştirmek istiyorum. Yani DirectoryExists functionunun tüm dizinlerde arama yapanını

if not Klasör_VarMı ('D:\' , 'Yerli' ) then...
if not Klasör_VarMı ('D:\' , 'Gülşen' ) then...
if not Klasör_VarMı ('D:\' , '2016pop' ) then...
Kullanıcı avatarı
greenegitim
Üye
Mesajlar: 713
Kayıt: 28 Nis 2011 10:33
Konum: İstanbul

Re: DirectoryExists ile tüm alt dizinleri kontrol etme

Mesaj gönderen greenegitim »

verdiğim örnek beli bir dizindeki klasörleri ve varsa onun alt klasörlerini de listeliyor.
cmd açın d: geçin sonra tree yazıp enter a basın verdiğim kod aynı işlemi yapıyor bendeki sonuç aşağıdaki gibi sonuç veriyor.
d:\ARGE
d:\ARGE\3d-editor
d:\ARGE\3d-editor\Kurs
d:\ARGE\3d-editor\Kurs\Dlls
d:\ARGE\3d-editor\Kurs\Icons
d:\ARGE\3d-editor\Kurs\Icons\Cars
d:\ARGE\3d-editor\Kurs\Units
d:\ARGE\3d-editor\Kurs\Units\DirectX
d:\ARGE\analog-clock-source
d:\ARGE\analog-clock-source\Analog Clock
d:\ARGE\bancodedados
Mücadele güzelleştirir!
Kullanıcı avatarı
greenegitim
Üye
Mesajlar: 713
Kayıt: 28 Nis 2011 10:33
Konum: İstanbul

Re: DirectoryExists ile tüm alt dizinleri kontrol etme

Mesaj gönderen greenegitim »

Yanlış anlamadıysam eğer senin elinde bir liste var bu listedeki klasörler varmı yoksa oluştur demek istiyorsun
bir memoda olsun bu liste döngüyle varmı diye kontrol etirir yoksa ForceDirectories(memo.lines[dongudegiskeni])

if DirectoryExists('d:\ARGE\Delphi Projeleri Fırat Universitesi\bazı projeler\Delphi Proje otel') then
begin
ShowMessage('Klasör Var');
end;
Mücadele güzelleştirir!
Kullanıcı avatarı
freeman35
Admin
Mesajlar: 2380
Kayıt: 12 Haz 2003 04:05
Konum: merkez camii yanı

Re: DirectoryExists ile tüm alt dizinleri kontrol etme

Mesaj gönderen freeman35 »

"aranacak klasör adı"nı parse et.
TStringList.Delimiter:= '\'; TStringList.Text:= aranacak klasör adı; // Tembel işi ;)
sonra döngü içinde
if not direxist(Root + TStringList.strings)then begin //burada bulamadıysa sonrasıda yok demektir, yani I dahil sonraki Item ları tek tek root a eklemeye devam ederek create edersin
else Continue;
ZAGOR TENAY TÜRK'tür... TÜRK kalacak...
Zoru başarırım, İmkansız zaman alır
FreeMan 35.5

Soru sormaya üşenmiyorsan, sorunun çözümünü yazmaya da üşenme !!!
Lord_Ares
Üye
Mesajlar: 1070
Kayıt: 15 Eki 2006 04:33
Konum: Çorlu

Re: DirectoryExists ile tüm alt dizinleri kontrol etme

Mesaj gönderen Lord_Ares »

greenegitim yazdı:Yanlış anlamadıysam eğer senin elinde bir liste var bu listedeki klasörler varmı yoksa oluştur demek istiyorsun
bir memoda olsun bu liste döngüyle varmı diye kontrol etirir yoksa ForceDirectories(memo.lines[dongudegiskeni])

if DirectoryExists('d:\ARGE\Delphi Projeleri Fırat Universitesi\bazı projeler\Delphi Proje otel') then
begin
ShowMessage('Klasör Var');
end;
DirectoryExists(D:\Mp3\Test) dediğinizde Mp3 klasöründe Test klasörü varsa true döndürüyor. Benim yapmaya çalıştığımda DirectoryExists('D:') diyerek
sürücüdeki tüm klasörleri tek tek gez bu isimde klasör varmı diye kontrol et. Yani bu fonksiyonu döngüye sokarak tüm dizinlerde aratmak. En son çare Freeman arkadaşımın dediği gibi sürücüsündeki tüm dizin isimlerini bir listede tutup karşılaştırma yapacağım. :)))
Cevapla