PDA

View Full Version : تابع پاک کردن کلی یک پوشه (اما خطا میگیرد)



abolfazl-z
شنبه 05 مرداد 1392, 23:49 عصر
سلام دوستان :لبخندساده:
تابع زیر را در نظر بگیرید :


function RemoveDirFull($dir)
{
$structure = get_list_file($dir,'*',true,true);
if (is_array($structure))
{
foreach($structure as $file)
{
if (is_dir($file))
RemoveDirFull($file);
elseif (is_file($file))
unlink($file);
}
}
rmdir($dir);
}
این تابع هم هست :

function get_list_file($path,$extension='*',$show_folder=fa lse,$show_link=false)
{
$file_list = array();
$not_file = array('.','..');
$handle = opendir($path);
if(!$handle) return false;
while(($file_dir = readdir($handle))!==false)
{
if(!in_array($file_dir,$not_file) )
if($show_folder || is_file($path.'/'.$file_dir))
{
if($extension=='*')
$file_list[] = $file_dir;
else
{
$ext = pathinfo($file_dir,PATHINFO_EXTENSION);
if($ext===$extension)
$file_list[] = $file_dir;
}
if(is_dir($path.'/'.$file_dir))
$file_list[count($file_list)-1] .= '/';
if($show_link)
$file_list[count($file_list)-1] = $path.$file_list[count($file_list)-1];
}
}
return $file_list;
}

خوب حالا شما بصورت زیر پوشه بسازید :

localhost/a
localhost/a/1
localhost/a/1/2
خوب حالا آدرس localhost/a را به تابع RemoveDirFull بدهید ! مشاهده می کنید که خطایی مبنی بر اینکه پوشه موردنظر خالی نیست را نشان می دهد ! که قاعدتا و بصورت طئوری نباید این خطا را بدهد چون پوشه ها خالی هستند !
در چند سایت خارجی هم چنین تابع هایی بود که همین عمل را انجام میدادند ولی همشون همون خطا را میداد.

مشکل چیست ؟ :متفکر:

Javidhb
یک شنبه 06 مرداد 1392, 01:39 صبح
با این درست کار کرد:


RemoveDirFull('C:\wamp\www\test\a');

توی پوشه هم یه فایل گذاشتم، ارور داد که خالی نیست و پاک نکرد.

MMSHFE
یک شنبه 06 مرداد 1392, 08:30 صبح
این کد رو تست کنید:


function RemoveDirFull($dir) {
$previousDir = getcwd();
if(file_exists($dir) && is_dir($dir)) {
chdir($dir);
$contents = scandir($dir);
unset($contents[0], $contents[1]); // Skip . and .. folders (necessary)
if(count($contents) > 0) {
foreach($contents as $content) {
if(is_dir($content)) {
RemoveDirFull($dir . '/' . $content);
}
else {
unlink($dir . '/' . $file);
}
}
}
chdir($previousDir);
rmdir($dir);
}
}

MMSHFE
یک شنبه 06 مرداد 1392, 08:31 صبح
نکته: مسیر باید مطلق داده بشه (C:\wamp\www\mysite) و واردکردن مسیر بصورت URL اشتباهه.

abolfazl-z
یک شنبه 06 مرداد 1392, 11:54 صبح
تابع شما بخوبی کار کرد ولی مشکل تابع من چیست ؟

MMSHFE
یک شنبه 06 مرداد 1392, 12:22 عصر
دقت کنید که هربار file$ رو میخونید، فقط اسم فایل رو میده و باید قبلش dir$ رو همراه با / اضافه کنید تا مسیر کامل رسیدن به فایل تولید بشه. ضمناً باید با chdir وارد پوشه موردنظر بشین تا وقتی میگین فایل رو حذف کنه، توی پوشه حاوی فایل قرار گرفته باشین. بعد از انجام کار هم دوباره با chdir به مسیر قبلی (که با getcwd گرفتین) برگردین.

abolfazl-z
یک شنبه 06 مرداد 1392, 12:30 عصر
دقت کنید که هربار file$ رو میخونید، فقط اسم فایل رو میده و باید قبلش dir$ رو همراه با / اضافه کنید تا مسیر کامل رسیدن به فایل تولید بشه. ضمناً باید با chdir وارد پوشه موردنظر بشین تا وقتی میگین فایل رو حذف کنه، توی پوشه حاوی فایل قرار گرفته باشین. بعد از انجام کار هم دوباره با chdir به مسیر قبلی (که با getcwd گرفتین) برگردین.

تابع get_list_file مسیر کامل رو نشون میدهد ولی مشکل از همون chdirکه گفتین هست. ولی چرا باید توی پوشه فایل قرار داشته باشیم تا بتونیم اون رو پاک کنیم مگر نمی شود مستقیم پاک اش کرد ؟ (همین من رو به اشتباه انداخت)

abolfazl-z
یک شنبه 06 مرداد 1392, 12:40 عصر
فهمیدم مشکل ام کجاست مشکل از تابع get_list_file هست .

و فکر نکنم ربطی به تغییر دایرکتوری باشد . چون به آدرس زیر رجوع کنید :
http://de3.php.net/manual/de/function.rmdir.php#107233

MMSHFE
یک شنبه 06 مرداد 1392, 12:43 عصر
نه اشتباه نکنید، chdir اجباری نیست ولی باعث میشه که نیازی نباشه dir$ رو حتماً قبلش اضافه کنید. برای مثال، اگه از chdir$ استفاده نکنیم، باید به این شکل فایل رو حذف کنیم:

unlink($dir . '/' . $file);