DirectoryExists ile tüm alt dizinleri kontrol etme
Forum kuralları
Forum kurallarını okuyup, uyunuz!
Forum kurallarını okuyup, uyunuz!
DirectoryExists ile tüm alt dizinleri kontrol etme
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
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
Re: DirectoryExists ile tüm alt dizinleri kontrol etme
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 !!!
Zoru başarırım, İmkansız zaman alır
FreeMan 35.5
Soru sormaya üşenmiyorsan, sorunun çözümünü yazmaya da üşenme !!!
Re: DirectoryExists ile tüm alt dizinleri kontrol etme
freeman35, örneğiniz için çok teşekkür ederim. Fakat ben bundan, klasör varsa true yada false değeri döndürmedim.
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 yazdı:
Burdaki Linki kontrol edebilirsiniz.
http://delphi.about.com/od/vclusing/a/findfile.htm
Re: DirectoryExists ile tüm alt dizinleri kontrol etme
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;

En son dicle_gsm tarafından 19 Eki 2016 11:59 tarihinde düzenlendi, toplamda 1 kere düzenlendi.
Re: DirectoryExists ile tüm alt dizinleri kontrol etme
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.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.
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 !!!
Zoru başarırım, İmkansız zaman alır
FreeMan 35.5
Soru sormaya üşenmiyorsan, sorunun çözümünü yazmaya da üşenme !!!
Re: DirectoryExists ile tüm alt dizinleri kontrol etme
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.
Konuyu biraz daha araştıracağım.
- greenegitim
- Üye
- Mesajlar: 713
- Kayıt: 28 Nis 2011 10:33
- Konum: İstanbul
Re: DirectoryExists ile tüm alt dizinleri kontrol etme
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!
Re: DirectoryExists ile tüm alt dizinleri kontrol etme
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...
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...
- greenegitim
- Üye
- Mesajlar: 713
- Kayıt: 28 Nis 2011 10:33
- Konum: İstanbul
Re: DirectoryExists ile tüm alt dizinleri kontrol etme
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
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!
- greenegitim
- Üye
- Mesajlar: 713
- Kayıt: 28 Nis 2011 10:33
- Konum: İstanbul
Re: DirectoryExists ile tüm alt dizinleri kontrol etme
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;
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!
Re: DirectoryExists ile tüm alt dizinleri kontrol etme
"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;
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 !!!
Zoru başarırım, İmkansız zaman alır
FreeMan 35.5
Soru sormaya üşenmiyorsan, sorunun çözümünü yazmaya da üşenme !!!
Re: DirectoryExists ile tüm alt dizinleri kontrol etme
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:') diyerekgreenegitim 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;
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.
