PDA

View Full Version : بدست آوردن لیست پوشه ها و فایل ها با تعیین سطح جستجو و نمایش درختی



hadisalahi2
شنبه 13 مهر 1392, 17:34 عصر
با سلام به همه دوستان

من میخوام یک برنامه کاوشگر فایل بنویسم و نیاز دارم تا لیست فایل و دایرکتوری های یک مسیر ور در بیارم

با استفاده از کد زیر میتونم لیست فایلها و زیر پوشه های یک مسیر مشخص رو استخراج کنم:



procedure TForm1.Button2Click(Sender: TObject);
var S,x: string;
const
SourceDir = 'G:\Hadi\Autocad\';
begin

for S in TDirectory.GetDirectories(SourceDir, TSearchOption.soAllDirectories,
function(const Path: string; const SearchRec: TSearchRec): Boolean
begin
Result := True;
end) do Begin
memo1.Lines.Add(s);
for x in TDirectory.GetFiles(s,function(const Path: string; const SearchRec: TSearchRec): Boolean
begin
Result := True;
end) do memo2.Lines.Add(X);

End;
end;


حالا اینجا دو تا سوال دارم:

اول اینکه این کد ها ٰ فایلهای داخل مسیر اولیه رو نشون نمیده و فقط زیر شاخه ها و فایلهای داخل اونها رو نشون میده

مثلا اگه مسیر من G:\Hadi\Autocad هست و داخل این پوشه هم فایل باشه اونها رو نشون نمیده

***********
دوم اینکه :چطوری همزمان که این مسیرها رو میخونم ٰ اون رو به همراه فایلهای موجود به صورت درختی نشون بدم

به نظر شما اول بریزم توی یک Table و بعد بیام لیست درختی رو بسازم
یا راه ساده تر و سریع تری برای این کار وجود داره؟

ممنون میشم از کمک دوستان
یا حق

lord_viper
یک شنبه 14 مهر 1392, 07:43 صبح
تابع TDirectory.GetFiles لیست فایلهای یک پوشه رو برمیگردونه شما اول کد زیر رو اجرا کنید


for x in TDirectory.GetFiles(s,function(const Path: string; const SearchRec: TSearchRec): Boolean
begin
Result := True;
end) do memo2.Lines.Add(X);
و به جای s از S استفاده کنید تا لیست فایلهای اصلی پوشه شما رو بده

برای کار دومتون هم باید یک مقدار کدها رو دستکاری کنید
برای کار دوم هم مثال از Treeviewبه همراه node و child node زیاد هست

hadisalahi2
سه شنبه 16 مهر 1392, 09:26 صبح
تابع TDirectory.GetFiles لیست فایلهای یک پوشه رو برمیگردونه شما اول کد زیر رو اجرا کنید


این رو خودم میدونستم :چشمک:
بله حق با شماست یک بار باید قبل از حلقه اصلی بزارم



و به جای s از S استفاده کنید تا لیست فایلهای اصلی پوشه شما رو بده

مگه فرقی هم با هم دارند ؟:متعجب:

hadisalahi2
چهارشنبه 17 مهر 1392, 15:27 عصر
توی این مدل جستجو ، چه طوری میشه سطح جتسجو تعیین کرد؟
مثلا من یک فولد دارم که شامل 10 تا زیر زیر فولدر هستش
حالا من میخوام ، کاربر تعیین کنه که نهایت زیر پوشه ها رو تا 3 سطح جستجو کن

و برنامه هم فقط سه تا از زیر پوشه ها رو بره و بعد ، برگرده به پوشه بعدی

*جیگرم*
چهارشنبه 17 مهر 1392, 19:02 عصر
از تابع بازگشتی استفاده کنید.

procedure dirs(var dir:TStrings;sRoot:string;lvl:ShortInt);
var
s: string;
DPredicate: TDirectory.TFilterPredicate;
begin
DPredicate := function(const sRoot: string; const SearchRec: TSearchRec): Boolean
begin
Result := (SearchRec.Attr and faSysFile)=0;
end;
if lvl=0 then Exit;
for s in TDirectory.GetDirectories(sRoot, DPredicate) do begin
dir.Add(S);
dirs(dir,s,lvl-1);
end;
end;

hadisalahi2
پنج شنبه 18 مهر 1392, 10:55 صبح
اون LVL تعداد سطوح رو مشخص میکنه؟

*جیگرم*
پنج شنبه 18 مهر 1392, 13:08 عصر
اون LVL تعداد سطوح رو مشخص میکنه؟
بله همینطوره.

hadisalahi2
یک شنبه 21 مهر 1392, 09:49 صبح
کد شما کاملا درست بود و مچکرم از این کد
حالا اگه بخوام ، همزمان با جستجوی فولدر ها ، فایلها رو هم لیست کنه ، باید به همون روش اولی که خودم نوشتم این کار رو انجام بدم یا اون رو تبدیل به بازگشتی کنم

حالا اگه باید بازگشتی بشه ، به چه روشی؟
من میخوام همه داخل یک پروسیجر باشه و از دو تا تابع بازگشتی استفاده نکنم