PDA

View Full Version : حذف دایرکتوری



(امید)
دوشنبه 12 اسفند 1381, 11:09 صبح
برداشت شده از barnamenevis.com

__________________________________________________ ________

با عرض سلام خدمت دوستان گرامی

آیا متدی برای از بین بردن دایرکتوری غیر خالی در ویندوز وجود دارد؟


موفق باشید
یا علی(ع)


با سلام؛



RmDir و RemoveDir را بخوان


ح.ر



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

فایلها و زیر دایرکتوریهای آنرا حذف و خود آنرا نیز حذف میکند.

خیلی تست نشده ولی تا حالا جواب داده.

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, [bkOk]) ;
DeleteFile(WildCard+SearchRec.Name) ;
WildCard := WildCard + S ;
End ;
End ;
Status := FindNext(SearchRec) ;
End ;
End ;


بعوان مثال با این صورت صدا بزنید :

CustomDelete('C:\TEMP\*.*')


بابک یعقوبی



با عرض سلام

جناب یعقوبی همانطور که در بالا گفته ام بنده نمی خواهم پاک کردن فایل به فایل انجام دهم چرا که تعداد فایل های موجود در دایرکتوریهای مورد نظر من بسیار زیاد است. بلکه می خواهم کل دایرکتوری را مستقل از تعداد فایل های موجود در آن پاک کنم.


موفق باشید
یا علی(ع)



دوست عزیز شما دیده اید که خود ویندوز یک همچین کاری بکند ؟

علت آن این است که حتی روشی وجود دارد که شما میتوانید بر روی هارد از قسمت FAT

دایرکتوری خود را پیدا کرده و آن را از همانجا حذف کنید. ولی مسئله اینجاست در FAT

فایلهای مربوط به آن دایرکتوری بدون Parent میمانند و این برای ویندوز یعنی اینکه اولا

فضای مربوطه هنوز خالی نشده ثانیا در اولین ScanDisk که انجام شود تمامی فایلهای

داخل آن دایرکتوری بعنوان Lost Cluster مشخص میشود.

حالا انتخاب با خودتان است. به هر صورت که دوست دارید عمل کنید.


بابک یعقوبی

Ali_Hashemi
دوشنبه 04 خرداد 1383, 14:06 عصر
این کد از روش بازگشتی استفاده میکنه
البته یک راه بهترهم وجود داره ولی
مشکلش اینه که دایرکتوری به
RecycleBin
میره
ولی این تابع خیلی خوب عمل میکنه
var
DrivePathsBuff:Array[0..1024] Of Char;
DrivesPaths:String;
Len:Longword;
ShortPath:Array[0..max_path] Of Char;
Dir:Tfilename;
Procedure rDeltree(const Directory: Tfilename);
//Recursively Deletes All Files And Directories
//Inside The Directory Passed As Parameter.
var
SearchRec:TsearchRec;
Attributes:LongWord;
ShortName,FullName:TFileName;
Pname:Pchar;
Begin
If FindFirst(Directory+'*',faAnyFile And Not faVolumeID,
SearchRec) = 0 Then Begin
Try
Repeat //Process All Files And Directories
If SearchRec.FindData.cAlternateFileName[0]=#0 Then
ShortName:= SearchRec.Name
Else
ShortName:=SearchRec.FindData.cAlternateFileName;
FullName:=Directory+ShortName;
If (SearchRec.Attr And fadirectory) <>0 Then Begin
//its A Directory
If (ShortName<> '.') And (ShortName <> '..') Then
rDeltree(FullName+'\');
end
else begin
//it is a file
pname:=pchar(FullName);
Attributes:=GetFileAttributes(Pname);
if Attributes = $FFFFFFFF Then
raise EInOutError.Create(SysErrorMessage(GetLastError));
If (Attributes And file_Attribute_readonly) <> 0 Then
SetFileAttributes(Pname,Attributes And Not
file_Attribute_readonly);
If Windows.DeleteFile(Pname) = False Then
Raise EInOutError.Create(SysErrorMessage(GetLastError));
End;
Until FindNext(SearchRec)<> 0;
Except
FindClose(SearchRec);
raise;
End;
FindClose(SearchRec);
//Raise;
End;
If Pos(#0 + Directory +#0 , DrivesPaths)=0 then Begin
// If Not Aroot Directory , Remove It
Pname:=Pchar(Directory);
Attributes:=GetFileAttributes(Pname);
If Attributes= $FFFFFFFF Then
Raise EInOutError.Create(SysErrorMessage(GetLastError));

If (Attributes And file_Attribute_readonly) <> 0 Then
SetFileAttributes(Pname,Attributes And Not
file_Attribute_readonly);
If WindowS.RemoveDirectory(Pname)=false Then Begin
Raise EInOutError.Create(SysErrorMessage(GetLastError));
End;
End;
End;
Begin
DrivePathsBuff[0]:=#0;
Len:=GetLogicalDriveStrings(1022,@DrivePathsBuff[1]);
if Len=0 then
raise EInOutError.Create(SysErrorMessage(GetLastError));

SetString(DrivesPaths,DrivePathsBuff,len+1);
DrivesPaths:=UpperCase(DrivesPaths);
len:=GetShortPathName(pchar(Directory),ShortPath,m ax_path);
if len =0 then
raise EInOutError.Create(SysErrorMessage(GetLastError));
SetString(Dir,ShortPath,len);
Dir:=UpperCase(Dir);
rDeltree(IncludeTrailingBackslash(dir));
end;