2009-12-17 13 views
6

के बाद ऑटो सभी फ़ाइलों को हटाएं x-time (24 घंटों के बाद कहें) के बाद आप उप-निर्देशिका के तहत सभी फ़ाइलों को कैसे हटा सकते हैं - सर्वर या पीएल से cronjob कमांड का उपयोग किए बिना। आप इसे PHP कोड का उपयोग करके या किसी पृष्ठ पर क्लिक किए बिना पृष्ठ पर जाकर और कमांड ऑटो चला सकते हैं।एक्स-टाइम

उत्तर

11

प्रतिक्रिया। मैं कोड नमूना लिखने जा रहा हूं, इसलिए मैंने एक और टिप्पणी जोड़ने के बजाय एक और जवाब बनाया है।

कस्टम विस्तार के साथ फ़ाइलें निकालने के लिए आप कोड लागू करने के लिए है:, 1. इस उदाहरण नियमित अभिव्यक्ति /\.txt$/i, जिसका मतलब है का उपयोग करता है विस्तार txt के साथ ही फाइलों को हटा दिया जाएगा:

<?php 
    $path = dirname(__FILE__).'/files'; 
    if ($handle = opendir($path)) { 

    while (false !== ($file = readdir($handle))) { 
     if ((time()-filectime($path.'/'.$file)) < 86400) { // 86400 = 60*60*24 
      if (preg_match('/\.txt$/i', $file)) { 
      unlink($path.'/'.$file); 
      } 
     } 
    } 
    } 
?> 

टिप्पणी। '$' चिह्न का अर्थ है, कि फ़ाइल नाम को '.txt' स्ट्रिंग के साथ समाप्त करना होगा। ध्वज 'मैं' इंगित करता है, कि तुलना केस-असंवेदनशील होगी। preg_match() फ़ंक्शन के बारे में अधिक जानकारी।

इसके अलावा आप कुछ एक्सटेंशन के साथ फ़ाइलों को खोजने के लिए strripos() फ़ंक्शन का उपयोग कर सकते हैं।

<?php 
    $path = dirname(__FILE__).'/files'; 
    if ($handle = opendir($path)) { 

    while (false !== ($file = readdir($handle))) { 
     if ((time()-filectime($path.'/'.$file)) < 86400) { // 86400 = 60*60*24 
      if (strripos($file, '.txt') !== false) { 
      unlink($path.'/'.$file); 
      } 
     } 
    } 
    } 
?> 

टिप्पणी:: यहाँ कोड का टुकड़ा है इस उदाहरण और अधिक स्पष्ट लगता है। strripos() के परिणाम को दो कार्यों के संयोजन के साथ भी हासिल किया जा सकता है: strrpos(strtolower($file), '.txt'), लेकिन, आईएमएचओ, यह आपके कोड में कम फ़ंक्शंस का उपयोग करने के लिए एक अच्छा नियम है ताकि इसे और अधिक पठनीय और छोटा बनाया जा सके। कृपया, strripos() फ़ंक्शन (वापसी मूल्य ब्लॉक) के पृष्ठ पर ध्यान से चेतावनी पढ़ें।

एक और महत्वपूर्ण नोटिस: यदि आप यूनिक्स सिस्टम का उपयोग कर रहे हैं, तो फाइल अनुमतियों के कारण फ़ाइल हटाने में विफल हो सकता है। आप मैनुअल को chmod() फ़ंक्शन के बारे में देख सकते हैं।

शुभकामनाएं।

+2

readdir + preg_match के बजाय ग्लोब() का उपयोग क्यों न करें? –

+0

आप सही हैं। मैंने glob() फ़ंक्शन के बारे में नहीं लिखा क्योंकि मैंने पहले कभी इसका उपयोग नहीं किया है। :) आपकी टिप्पणी के लिए धन्यवाद। – Alex

+0

नोट किया गया एलेक्स और बहुत बहुत धन्यवाद – jones

7

फ़ाइल निर्माण के समय की जांच करने और इसकी फ़ाइल/फ़ाइलों को हटाने के लिए आप PHP कोर फ़ंक्शंस filectime() और unlink() का उपयोग कर सकते हैं।

संपादित करें। कोड उदाहरण: मेरा पहला जवाब से अंतिम टिप्पणी के लिए

if ($handle = opendir('/path/to/files')) { 

    while (false !== ($file = readdir($handle))) { 
     if (filectime($file)< (time()-86400)) { // 86400 = 60*60*24 
      unlink($file); 
     } 
    } 
    } 
+0

यह फ़ंक्शन का केवल कंकाल है। आप कोई भी शर्तें जोड़ सकते हैं, उदा। कस्टम एक्सटेंशन या फ़ाइलों वाली फ़ाइलें, जो कुछ पैटर्न आदि से मेल खाते हैं – Alex

+0

धन्यवाद एलेक्स .... मुझे आशा है कि यह काम .. – jones

+0

आपका स्वागत है। मैं आपकी मदद करके खुश हूँ। यदि यह उत्तर आपके लिए उपयुक्त है, तो आप मेरे उत्तर के पास एक टिक क्लिक करके इसे स्वीकार कर सकते हैं। – Alex

0

मैं आदेश पर खोल उपयोग करें, यह एक cronjob की तरह है, हालांकि

php:

exec("echo rm /somedir/somefile.ext|at now +24 hours"); 
0

यहाँ एक और उदाहरण GLOB का उपयोग करता है और यह किसी भी फ़ाइल

$files = glob('path/to/your/files/*'); 

foreach($files as $file) { // iterate files 
    // if file creation time is more than 5 minutes 
    if ((time() - filectime($file)) > 3600) { // 86400 = 60*60*24 
     unlink($file); 
    } 
} 

या यदि नष्ट करेगा आप कुछ फाइलों को बाहर करना चाहते हैं

$files = preg_grep('#\.txt#', glob('/path/to/your/files/*'), PREG_GREP_INVERT); 
2

वैसे हम यहां जाते हैं, PHP स्क्रिप्ट जो उन फ़ाइलों को हटा देती है जो X की पुरानी संख्या है।

<? 
$days = 1; 
$dir = dirname (__FILE__); 

$nofiles = 0; 

    if ($handle = opendir($dir)) { 
    while (($file = readdir($handle)) !== false) { 
     if ($file == '.' || $file == '..' || is_dir($dir.'/'.$file)) { 
      continue; 
     } 

     if ((time() - filemtime($dir.'/'.$file)) > ($days *86400)) { 
      $nofiles++; 
      unlink($dir.'/'.$file); 
     } 
    } 
    closedir($handle); 
    echo "Total files deleted: $nofiles \n"; 
} 
?> 

अब इस कोड पेस्ट और एक php फ़ाइल के रूप में बचाने के लिए, जहाँ आप फ़ाइल को हटाना चाहते से फ़ोल्डर में अपलोड करें।आप इस php कोड

$days = 1; 

कि दिनों की संख्या सेट करता है, उदाहरण के लिए आप इसे सेट करता है, तो 2 के लिए तो फ़ाइलों से अधिक उम्र के 2 दिन हटा दिया जाएगा की शुरुआत में देख सकते हैं। मूल रूप से यह क्या होता है,

if ($file == '.' || $file == '..' || is_dir($dir.'/'.$file)) { 
      continue; 
} 

जब आप स्क्रिप्ट चलाने, वर्तमान निर्देशिका हो जाता है और फ़ाइल प्रविष्टियों पढ़ता है, वर्तमान निर्देशिका और आगे जांच के लिए छोड़ देता है '।' अगर कोई अन्य निर्देशिकाओं रहे हैं फ़ाइल प्रविष्टि है नहीं एक निर्देशिका तो यह फ़ाइल संशोधित समय (अंतिम संशोधित समय) को हासिल करेगा और तुलना, अगर यह वर्ष

if ((time() - filemtime($dir.'/'.$file)) > ($days *86400)) { 
      $nofiles++; 
      unlink($dir.'/'.$file); 
} 

अगर हालत यह अनलिंक की मदद से फ़ाइल को हटा देता है तो सच हो जाता है दिनों की संख्या है() php समारोह। अंत में निर्देशिका बंद हो जाती है और बाहर निकलती है। मैंने हटाए जा रहे फ़ाइलों की संख्या को गिनने के लिए एक काउंटर भी जोड़ा है, जो हटाने की प्रक्रिया के अंत में प्रदर्शित किया जाएगा। तो निर्देशिका में php फ़ाइल रखें जिसे फ़ाइल हटाने और इसे निष्पादित करने की आवश्यकता है।

उम्मीद है कि मदद करता है कि :)

0
function deleteCachedData($hours=24) 
{ 
    $files = glob(ROOTDIR.DIRECTORY_SEPARATOR.'tmp'.DIRECTORY_SEPARATOR.'*.txt'); 
    foreach($files as $file) { 
     if(is_file($file) && (time() - filectime($file)) > $hours*3600) { 
      unlink($file); 
     } 
    } 

}

0

इन उदाहरणों का उपयोग करने की कोशिश कर के बाद, मैं मुद्दों के एक जोड़े को मारा:

  1. तुलना ऑपरेटर से अधिक होना चाहिए, नहीं
  2. फ़ाइलमाटा से कम संशोधित समय लौटाता है। फ़ाइलटाइम वह समय है जब फ़ाइल का इनोड डेटा बदल जाता है; अर्थात, जब अनुमति, स्वामी, समूह, या inode से अन्य मेटाडाटा अद्यतन किया जाता है, अप्रत्याशित परिणाम

मैं उदाहरण filemtime उपयोग करने के लिए बदल गया है और तुलना तय इस प्रकार को जन्म दे सकती है जो:

<?php 
    $path = dirname(__FILE__).'/files'; 
    if ($handle = opendir($path)) { 

    while (false !== ($file = readdir($handle))) { 
     if ((time()-filemtime($path.'/'.$file)) > 86400) { // 86400 = 60*60*24 
      if (preg_match('/\.txt$/i', $file)) { 
      unlink($path.'/'.$file); 
      } 
     } 
    } 
    } 
?> 

 संबंधित मुद्दे

  • कोई संबंधित समस्या नहीं^_^