PDA

View Full Version : لیست فایل های ی دایرکتوری



khorsandreza
پنج شنبه 28 آبان 1388, 12:06 عصر
سلام :
میخواهم فایل های موجود در یک پوشه را براساس قالب (jpg.*) لیست گیری کنم و سپس فایل ها را یکی به یک کنترل کرده و در یک بانک بر اساس نام فایل ذخیره کنم.
ساختار بانک بشکل زیر است
PKID - نوع عددی و AutoNumber
FileName- متتنی بطول 15 کاراکتر
JPGTasvir- فیلد از نوع Image است
در مورد ذخیر یا بازیابی از بانک مشکلی نیست فقط لیست کردن هر تعداد فایل موجود ر پوشه . در یک لیست باکس و یا روش های دیگر

Felony
پنج شنبه 28 آبان 1388, 12:16 عصر
در مورد کار با توابع FindFirst و FindNext در همین انجمن جست و جو کنید ، خود من چندین بار نمونه کد قرار دادم .

دلفــي
پنج شنبه 28 آبان 1388, 12:22 عصر
سلام :
میخواهم فایل های موجود در یک پوشه را براساس قالب (jpg.*) لیست گیری کنم و سپس فایل ها را یکی به یک کنترل کرده و در یک بانک بر اساس نام فایل ذخیره کنم.




procedure ListFileDir(Path: string; FileList: TStrings);
var
SR: TSearchRec;
begin
if FindFirst(Path + '*.*', faAnyFile, SR) = 0 then
begin
repeat
if (SR.Attr <> faDirectory) then
begin
FileList.Add(SR.Name);
end;
until FindNext(SR) <> 0;
FindClose(SR);
end;
end;

دلفــي
پنج شنبه 28 آبان 1388, 15:42 عصر
وقتی تو تابع FindFirst خصیصه ی faAnyFile رو معرفی میکنید تابع فقط دنبال فایل میگرده دیگه لازم نیست تو حلقه چک کنید ببینید گزینه ی پیدا شده فایل هست یا یک پوشه .

موفق باشید .


faAnyFile شامل Folder ها هم میشه !

vcldeveloper
جمعه 29 آبان 1388, 01:12 صبح
خیر اینطور نیست ، خصیصه های تابع FindFirst یکی از مقادیر زیر رو قبول میکنن : ( طبق کتابخانه ی sysutils )
این اعداد که به هر کدام از این ثابت ها اختصاص داده شدند، هر کدام یک بیت خاص در یک بایت مشخص را 1 می کنند. 10 (مقدار faDirectory) در هگزا میشه 10000 در باینری، 3F (مقدار faAnyFile) در هگزا میشه 111111 در باینری؛ یعنی همه 6 بیت دخیل در تعیین نوع فایل را یک میکنه، از جمله بیت 5 را، پس faAnyFile شامل faDirectory هم میشه.

Mahmood_M
جمعه 29 آبان 1388, 03:25 صبح
خصیصه ی FaAnyFile شامل فایلهای سسیتمی ، مخفی و ... میشه و ربطی به پوشه نداره !
اما همونطور که دوستمون اشاره کردن ، faAnyFile شامل پوشه ها هم هست ، پوشه هم در ویندوز نوعی فایل به حساب میاد ...
faAnyFile در واقع تمام خصیصه های موجود رو شامل میشه ، کدی که به عنوان نمونه قرار دادید ، پوشه ها رو هم پیدا می کنه ، برای پیدا نکردن پوشه مثلا میشه به صورت زیر عمل کرد :
var
S:TSearchRec;
begin
if FindFirst('C:\*.*', FaAnyFile - faDirectory, S) = 0 then
begin
try
repeat
ListBox1.AddItem(S.Name,nil);
until FindNext(S)<>0;
finally
FindClose(S);
end;
end;
end;

اما در مورد مقادیر زیر :

{ File attribute constants }

faReadOnly = $00000001 platform;
faHidden = $00000002 platform;
faSysFile = $00000004 platform;
faVolumeID = $00000008 platform;
faDirectory = $00000010;
faArchive = $00000020 platform;
faSymLink = $00000040 platform;
faAnyFile = $0000003F;

این مقادیر اعداد در مبنای 16 هستن ، عدد مربوط به faAnyFile یعنی 3F ( که F در اینجا یعنی 15 در مبنای 16 ، در مبنای 16 به جای اعداد 10 تا 15 به ترتیب A و B و C و D و E و F قرار داده میشه ) ، عدد 255 هست که در مبنای 2 شامل 8 تا 1 میشه ، یعنی تمام بیتهای یک بایت رو یک میکنه ...
حالا هرکدوم از مقادیر بالا یکی از صفرهای بایت مورد نظر رو یک می کنن ، توی لیست زیر می تونی مقدار باینری ( مبنای 2 ) اونها رو ببینی :

faReadOnly = $00000001 :=> 00000001
faHidden = $00000002 :=> 00000010
faSysFile = $00000004 :=> 00000100
faVolumeID = $00000008 :=> 00001000
faDirectory = $00000010 :=> 00010000
faArchive = $00000020 :=> 00100000
faSymLink = $00000040 :=> 01000000
faAnyFile = $0000003F :=> 11111111

نحوه ی مقدار دهی به صورتی هست که بشه با بررسی صفرها و یک ها تنظیمات این قسمت رو متوجه شد ... ( اگه دقت کنی ، مقادیری که به مشخصه ها نسبت داده شده با عدد 2 رابطه داره ( توان و ضریب ) تا در مبنای 2 بتونه مقدار مورد نظر رو ایجاد کنه )

امیدوارم مفید بوده باشه ...

موفق باشی ...

ویرایش :
جواب آقای کشاورز رو ندیده بودم ! شاید این مطالب هم مفید باشه ...

zahra_no
سه شنبه 09 فروردین 1390, 19:34 عصر
با سلام خدمت دوستان
عیدتون مبارک

من با استفاده از این تاپیک تونستم فایلهای یک پوشه رو لیست کنم اما یه سوال داشتم
چطوری میتونم هنگام لیست کردن نام فایلها نوع فایلها رو نشون نده

مثلا به جای learning.mp3 فقط learning رو نشون بده

ممنون

Felony
سه شنبه 09 فروردین 1390, 19:55 عصر
با سلام خدمت دوستان
عیدتون مبارک

من با استفاده از این تاپیک تونستم فایلهای یک پوشه رو لیست کنم اما یه سوال داشتم
چطوری میتونم هنگام لیست کردن نام فایلها نوع فایلها رو نشون نده

مثلا به جای learning.mp3 فقط learning رو نشون بده

ممنون
اگر مطمئن هستید که پسوند فایل ها 3 حرفی هست که میتونید با تابع Delete به تعداد 4 کاراکتر از آخر نام فایل حذف کنید اگر هم مطمئن نیستید پسوند فایل ها چقدر هست به صورت زیر :

var
FileName, FileExt: String;
begin
FileName:= 'C:\MyFile.exe';
FileExt:= ExtractFileExt(FileName);
Delete(FileName, Pos(FileExt, FileName), Length(FileExt));
ShowMessage(FileName);
end;

zahra_no
سه شنبه 09 فروردین 1390, 20:18 عصر
ممنون از کمکتون اقای تاجیک
ولی یه مشکلی
با این کدی که شما نوشتین کلا فایل برای برنامه ناشناخته میشه
من وقتی میخوام اون فایل رو از لیست اجرا کنم فایل ناشناخته میشه

من فقط میخوام نوعشو نشون نده نه اینکه کلا نوعشو پاک کنه.

M_Maskout
سه شنبه 09 فروردین 1390, 20:33 عصر
با سلام خدمت دوستان
عیدتون مبارک

من با استفاده از این تاپیک تونستم فایلهای یک پوشه رو لیست کنم اما یه سوال داشتم
چطوری میتونم هنگام لیست کردن نام فایلها نوع فایلها رو نشون نده

مثلا به جای learning.mp3 فقط learning رو نشون بده

ممنون

به کد زیر توجه کنین:


S := ChangeFileExt('learning.mp3', '');


تابع ChangeFileExt یه رشته رو به عنوان اسم فایل تو پارامتر اولش می‌گیره و پسوند اونو با پارامتر دومی که به اون داده شده عوض می‌کنه.
حالا اگر شما پارامتر دوم رو خالی بذارین، عملاً فقط اسم فایل رو برمی‌گردونه.
هرچند می‌شه از توابع copy و pos، تواماً استفاده کرد، اما به این خاطر که ممکنه اسم فایل خودش شامل نقطه باشه، این تابع با این روش استفاده، نام فایل داده شده رو به عنوان خروجی، بیرون می‌ده

Felony
سه شنبه 09 فروردین 1390, 20:35 عصر
خوب اینطور نمیشه که ، یک شئ از کلاس TStringList بسازید و آیتم ها رو بعد از به دست آوردن بریزید توش و به روش بالا هم پسوند رو حذف و در List نشون بدید با این کار در StringList نام فایل ها رو به صورت کامل دارید و در List اسم فایل ها رو بدون پسوند ، برای اجرا هم آیتم متناظر با List که انتخاب شده رو از داخل StringList به دست بیارید و اون رو اجرا کنید ، OK ؟

zahra_no
سه شنبه 09 فروردین 1390, 21:02 عصر
ممنون از دوستان عزیز
و یه معذرت از اقای تاجیک
چون راه حل ایشون هم درست بود در واقع هر دو مثل هم عمل میکرد مشکل از من بود که باید برای اجرای فایل mp3. رو آخرش باید اضافه کنم تا بشه اجراش کرد.


media.FileName:=(ExtractFilePath(Application.ExeNa me)+FileName+'.mp3');

یا

media.FileName:=(ExtractFilePath(Application.ExeNa me)+S+'.mp3');


دوستان ممنونم
موفق و سر بلند باشید.

M_Maskout
سه شنبه 09 فروردین 1390, 21:04 عصر
ممنون از کمکتون اقای تاجیک
ولی یه مشکلی
با این کدی که شما نوشتین کلا فایل برای برنامه ناشناخته میشه
من وقتی میخوام اون فایل رو از لیست اجرا کنم فایل ناشناخته میشه

من فقط میخوام نوعشو نشون نده نه اینکه کلا نوعشو پاک کنه.
اگه فقط از یه نوع فایل استفاده می‌کنین، می‌شه دوباره در زمان اجرای فایل، نوع رو به نام مورد نظر اضافه کنین، در غیر این صورت راهکار آقای تاجیک، کاملاً کاربردیه.

BORHAN TEC
چهارشنبه 10 فروردین 1390, 20:34 عصر
از زمان دلفی 2010 به بعد نحوه جستجوی فایل ها بسیار راحت تر شده است. علاوه بر مواردی که دوستان به آن اشاره کردند، در نسخه های جدید دلفی می توانید برای جستجوی فایل ها از رکورد TDirectory که در یونیت IOUtils قرار دارد استفاده کنید.در زیر هم یک مثال بسیار ساده را در این رابطه قرار داده ام:
procedure TForm1.FormCreate(Sender: TObject);
var
s: string;
begin
ListBox1.Items.Clear;
for s in TDirectory.GetFiles('c:\') do
ListBox1.Items.Add(s);
end;
در ضمن اگر نیاز بود بگویید تا مثالهای بیشتری را قرار بدهم... :لبخند: