PDA

View Full Version : پاک کردن تمام فایلهای با پسوند خاص یک پوشه



Valadi
دوشنبه 11 تیر 1386, 10:05 صبح
این کد پاک کردن تمام فایلهای با پسوند خاص یک پوشه است


Procedure CustomDelete(WildCard : String) ;
Var Status : Integer ;
SearchRec : TSearchRec ;
S : String ;
Begin
Status :=
FindFirst(WildCard,faReadOnly+faHidden+faSysFile+f aDirectory+faAnyFile, SearchRec) ;
While Status = 0 Do
Begin
If (SearchRec.Name <> '.') And (SearchRec.Name <> '..') Then
Begin
S := Copy(WildCard, Length(WildCard)-2, 3) ;
Delete(WildCard, Length(WildCard)-2, 3) ;
If SearchRec.Attr = faDirectory Then
Begin
CustomDelete(WildCard+SearchRec.Name+'\'+'*.*(یا پسوند دلخواه)') ;
RemoveDir(WildCard+SearchRec.Name) ;
WildCard := WildCard + S ;
End
Else
If SearchRec.Attr <> faDirectory Then
Begin
If Not DeleteFile(WildCard+SearchRec.Name) Then
MessageDlg(['اشکال در حذف فایل'],mtError, [mbOk],0) ;
DeleteFile(WildCard+SearchRec.Name) ;
WildCard := WildCard + S ;
End ;
End ;
Status := FindNext(SearchRec) ;
End ;
End ;


procedure TForm1.Button1Click(Sender: TObject);

begin

CustomDelete('نام درایو به همراه پوشه\*.*');

end;

اَرژنگ
دوشنبه 11 تیر 1386, 10:47 صبح
این کد پاک کردن تمام فایلهای با پسوند خاص یک پوشه است


Procedure CustomDelete(WildCard : String) ;
Var Status : Integer ;
SearchRec : TSearchRec ;
S : String ;
Begin
Status :=
FindFirst(WildCard,faReadOnly+faHidden+faSysFile+f aDirectory+faAnyFile, SearchRec) ;
While Status = 0 Do
Begin
If (SearchRec.Name <> '.') And (SearchRec.Name <> '..') Then
Begin
S := Copy(WildCard, Length(WildCard)-2, 3) ;
Delete(WildCard, Length(WildCard)-2, 3) ;
If SearchRec.Attr = faDirectory Then
Begin
CustomDelete(WildCard+SearchRec.Name+'\'+'*.*(یا پسوند دلخواه)') ;
RemoveDir(WildCard+SearchRec.Name) ;
WildCard := WildCard + S ;
End
Else
If SearchRec.Attr <> faDirectory Then
Begin
If Not DeleteFile(WildCard+SearchRec.Name) Then
MessageDlg(['اشکال در حذف فایل'],mtError, [mbOk],0) ;
DeleteFile(WildCard+SearchRec.Name) ;
WildCard := WildCard + S ;
End ;
End ;
Status := FindNext(SearchRec) ;
End ;
End ;


procedure TForm1.Button1Click(Sender: TObject);

begin

CustomDelete('نام درایو به همراه پوشه\*.*');

end;

با تشکر از زحمتتان
کدتان کاملا درسته و درش حرفی نیست.
اما روشش را میشه یکمی بهتر کرد.
یک فانکشن استفاده کنید که اسم فایلها را پیدا کند یک چیزی مانند TString بیرون بده،
یک پروسیجر که اسم فایلها رادریافت کرده و یکی یکی با for پیموده و دلیت کند.

فایده این روش این است که با پید کردن نام فایلها در یک فلدر کارهایه دیگری هم میتوانید انجام دهید (کدتان بیشتر ژنریک میشه).

dkhatibi
دوشنبه 11 تیر 1386, 13:49 عصر
راه ساده تر command خود داس
del *.exe

اَرژنگ
دوشنبه 11 تیر 1386, 14:30 عصر
راه ساده تر command خود داس
del *.exe
یعنی میگید برایه کاری که به راحتی میشه از داخل دلفی انجام داد ، بجاش از دلفی داس را صدا بزنیم؟

MNosouhi
دوشنبه 11 تیر 1386, 14:48 عصر
یعنی میگید برایه کاری که به راحتی میشه از داخل دلفی انجام داد ، بجاش از دلفی داس را صدا بزنیم؟
چه اشکالی داره؟
تازه خیلی ساده تر هم هست.
کافیه دستوری رو که گفتند در تابع winexec یا shellExecute اجراش کنیم ، همین.

اَرژنگ
دوشنبه 11 تیر 1386, 15:07 عصر
چه اشکالی داره؟
تازه خیلی ساده تر هم هست.
کافیه دستوری رو که گفتند در تابع winexec یا shellExecute اجراش کنیم ، همین.
۱ـسادگی انجام دادن یک کار دلیل بر درستیش نیست.
۲ـاگر بشه کاری را از داخل برنامه انجام داد چرا از یک چیزه خارج از برنامه کمک بگیریم؟
۳ـ حتا اگر هم برایه این حالت خیلی بخصوص استفاده بشه، با یک تغییر کوچک کاملا بیربط میشه، حالا میگید که تغییر کوچک چیه؟ مثلا فقط به جایه اینکه بر پسوند ربط داشته ، فرضا بگیم که که به یک متنی در درون فایل هم ربط داشته باشه یا به تاریخ فایل و یا هرچی. حالا این تغییر کوچک را با ین روش چطوری میشه حل کرد؟‌ در ثانی در کجا باید حلش کنیم؟ با داس و یا در داخل خود کد برنامه.
۴ـ استفاده از این روش چیزی به برنامه اضافه نمیکنه، ولی استفاده از پروسیجرهایی که یک فایل لیست میگریند و تماما کارها را در داخل همان برنامه انجام میدند به قابلیتهایه درونی برنامه اضافه میکنند.

ولی اگر تمام کاری که قراره انجام بشه همان دیلیت کردن فایلها با یک پسوند در یک فلدر باشه، دلفی برایه اینکار زیادیه . یک بچ‌فایل بسه. ولی وقتی میشه نیازمندی برنامه را کم نگه داشت، چرا زیادش کنیم؟‌ آنهم برایه کاری به این سادگی که با دلفی میشه به راحتی انجام داد.
در برنامه نویسی راحتی به کم نوشتن کد ربطی نداره، به اینکه با تغییرات (جزئی ) برنامه نشکنه ربط داره.

ali_abbasi22145
دوشنبه 11 تیر 1386, 15:27 عصر
با تشکر از زحمتتان
کدتان کاملا درسته و درش حرفی نیست.
اما روشش را میشه یکمی بهتر کرد.
یک فانکشن استفاده کنید که اسم فایلها را پیدا کند یک چیزی مانند TString بیرون بده،
یک پروسیجر که اسم فایلها رادریافت کرده و یکی یکی با for پیموده و دلیت کند.

فایده این روش این است که با پید کردن نام فایلها در یک فلدر کارهایه دیگری هم میتوانید انجام دهید (کدتان بیشتر ژنریک میشه).

سلام
اگر می شود با TString یک مثال بزنید که من دنبالش هستم.

Hamid_PaK
دوشنبه 11 تیر 1386, 16:14 عصر
اگر می شود با TString یک مثال بزنید که من دنبالش هستم.


procedure SearchIn(const Path: String;
var FileExts,List: TStrings; ScanSubDir: Boolean = True; MinSize: Cardinal = 1);
var
dFind: WIN32_FIND_DATA;
hFind: THandle;
sFind: String;
begin
sFind := IncludeTrailingPathDelimiter(Path);
hFind := FindFirstFile(pChar(sFind+'*.*'), dFind);
if hFind <> INVALID_HANDLE_VALUE then begin
repeat
if dFind.cFileName[0] <> '.' then begin
if (ScanSubDir) and (dFind.dwFileAttributes and FILE_ATTRIBUTE_DIRECTORY =
FILE_ATTRIBUTE_DIRECTORY)then begin
SearchIn(sFind+dFind.cFileName, FileExts, List, True, MinSize);
end else
if (FileExts.IndexOf(LowerCase(
ExtractFileExt(dFind.cFileName))) <> -1) and
(dFind.nFileSizeLow > MinSize) then begin
List.Add(sFind + dFind.cFileName);
end;
end;
until not FindNextFile(hFind, dFind);
Windows.FindClose(hFind);
end;
end;


یه چیز تو این مایه ها.

یا حق ...

dkhatibi
دوشنبه 11 تیر 1386, 16:59 عصر
shellexecute برا همین چیزاست.

MNosouhi
دوشنبه 11 تیر 1386, 23:19 عصر
۱ـسادگی انجام دادن یک کار دلیل بر درستیش نیست.
۲ـاگر بشه کاری را از داخل برنامه انجام داد چرا از یک چیزه خارج از برنامه کمک بگیریم؟
۳ـ حتا اگر هم برایه این حالت خیلی بخصوص استفاده بشه، با یک تغییر کوچک کاملا بیربط میشه، حالا میگید که تغییر کوچک چیه؟ مثلا فقط به جایه اینکه بر پسوند ربط داشته ، فرضا بگیم که که به یک متنی در درون فایل هم ربط داشته باشه یا به تاریخ فایل و یا هرچی. حالا این تغییر کوچک را با ین روش چطوری میشه حل کرد؟‌ در ثانی در کجا باید حلش کنیم؟ با داس و یا در داخل خود کد برنامه.
۴ـ استفاده از این روش چیزی به برنامه اضافه نمیکنه، ولی استفاده از پروسیجرهایی که یک فایل لیست میگریند و تماما کارها را در داخل همان برنامه انجام میدند به قابلیتهایه درونی برنامه اضافه میکنند.

ولی اگر تمام کاری که قراره انجام بشه همان دیلیت کردن فایلها با یک پسوند در یک فلدر باشه، دلفی برایه اینکار زیادیه . یک بچ‌فایل بسه. ولی وقتی میشه نیازمندی برنامه را کم نگه داشت، چرا زیادش کنیم؟‌ آنهم برایه کاری به این سادگی که با دلفی میشه به راحتی انجام داد.
در برنامه نویسی راحتی به کم نوشتن کد ربطی نداره، به اینکه با تغییرات (جزئی ) برنامه نشکنه ربط داره.
چقدر مسئله رو بزرگ می کنید؟
همه روش ها نهایتا از توابع خود ویندوز برای کار کردن با فایل ها استفاده می کنن و اینکه از کدوم روش استفاده کنیم بستگی به صورت مسئله داره و گرنه در اصل هیچ فرقی نمیکنن ، این موضوع کاملا سلبقه ای هستش ، من خودم هم همیشه ترجیح می دم که از کدنویسی با دلفی استفاده کنم .