2011-03-27 11 views
13

में अंतिम बार संशोधित फ़ाइल जाओ वहाँ एक निर्देशिका में केवल पिछले फ़ाइल का चयन करने का कोई तरीका है (एक्सटेंशन jpg|png|gif साथ?)एक निर्देशिका

या मैं पूरी निर्देशिका पार्स और filemtime का उपयोग कर जांच करने के लिए है?

उत्तर

35

हां आपको उन सभी के माध्यम से पढ़ना होगा। लेकिन चूंकि निर्देशिका पहुंच कैश की जाती है, इसलिए आपको इसके बारे में वास्तव में चिंता नहीं करनी चाहिए।

$files = array_merge(glob("img/*.png"), glob("img/*.jpg")); 
$files = array_combine($files, array_map("filemtime", $files)); 
arsort($files); 

$latest_file = key($files); 
+3

नहीं। यह एक बिल्टिन फ़ाइल नाम फ़िल्टर के साथ सिर्फ एक स्कैंडर() है। (मैंने एक बार PHP4 पुनर्मूल्यांकन लिखा है)। यहां वास्तविक समस्या दो ग्लोब का उपयोग कर रही है। यह 'ग्लोब ("img/*। {png' , jpg, gif} ", GLOB_BRACE) 'आपके मामले में। – mario

+1

सच है, स्कैंडर * सभी * प्रविष्टियां देता है। लेकिन ग्लोब इसे नीचे फ़िल्टर करता है पहले से। रीडडियर दृष्टिकोण में अंतर यह है कि आप इसे अधिक PHP/सिस्टम कॉल के साथ स्टॉप-एंड-गो फैशन में करते हैं। – mario

+0

ग्लोब संकलित सी कोड में लूपिंग करता है, जबकि readdir को धीमी PHP की आवश्यकता होती है जबकि लूप। – mario

4

मुझे याद नहीं है कि आपने कभी ऐसा फ़ंक्शन देखा है जो आप पूछेंगे।

तो, मुझे लगता है कि आपको सभी (कम से कम jpg/png/gif) फ़ाइलों के माध्यम से जाना होगा, और उनमें से प्रत्येक की अंतिम संशोधन तिथि की खोज करनी होगी।


यहाँ एक संभव समाधान है, एसपीएल की DirectoryIterator वर्ग के आधार पर:

$path = null; 
$timestamp = null; 

$dirname = dirname(__FILE__); 
$dir = new DirectoryIterator($dirname); 
foreach ($dir as $fileinfo) { 
    if (!$fileinfo->isDot()) { 
     if ($fileinfo->getMTime() > $timestamp) { 
      // current file has been modified more recently 
      // than any other file we've checked until now 
      $path = $fileinfo->getFilename(); 
      $timestamp = $fileinfo->getMTime(); 
     } 
    } 
} 

var_dump($path); 


बेशक , आप भी readdir() और अन्य इसी कार्यों के साथ एक ही बात कर सकता है।

+0

php में निर्मित जाना चाहिए था इस तरह के एक समारोह तो हम – dynamic

+0

सब dir पार्स करने के लिए की जरूरत नहीं है .. imo इस समारोह लेखन कि कठिन नहीं है ;-) ;;; और आपको थोड़ा विशिष्ट दिखने की ज़रूरत है, इसलिए यह कोर-डेवलपर्स के लिए PHP में स्वयं के फ़ंक्शन को लागू नहीं करना चाहता है। –

+0

यहां तक ​​कि आपने एक्सस्टेंशन लॉल के लिए भी जांच नहीं की है, इसलिए मैं इसे स्वीकार करने जा रहा हूं क्योंकि मुझे यकीन है कि रीडडियर (या यह समतुल्य) एक ग्लोब से तेज है + दूसरा पार्स – dynamic

0
function listdirfile_by_date($path) 
{ 
    $dir = opendir($path); 
    $list = array(); 
    while($file = readdir($dir)) 
    { 
     if($file != '..' && $file != '.') 
     { 
      $mtime = filemtime($path . $file) . ',' . $file; 
      $list[$mtime] = $file; 
     } 
    } 
    closedir($dir); 
    krsort($list); 

    foreach($list as $key => $value) 
    { 
     return $list[$key]; 
    } 
    return ''; 
} 
संबंधित मुद्दे