2012-05-17 17 views
13

मेरे पास 1.3 मिलियन फाइलों वाली एक निर्देशिका है जिसे मुझे डेटाबेस में स्थानांतरित करने की आवश्यकता है। मुझे पूरी निर्देशिका स्कैन किए बिना निर्देशिका से एक फ़ाइल नाम पकड़ने की जरूरत है। इससे कोई फर्क नहीं पड़ता कि मैं कौन सी फाइल पकड़ता हूं क्योंकि जब मैं इसके साथ काम करता हूं तो उसे हटा दूंगा और फिर अगले स्थान पर जाउंगा। क्या यह संभव है? मुझे लगता है कि सभी उदाहरण एक सरणी में पूरी निर्देशिका लिस्टिंग स्कैन करने लगते हैं। मुझे केवल प्रोसेसिंग के लिए एक समय में एक को पकड़ने की जरूरत है ... हर बार 1.3 मिलियन नहीं।PHP: मैं पूरी निर्देशिका स्कैन किए बिना निर्देशिका से एक फ़ाइल कैसे प्राप्त कर सकता हूं?

+0

@ जोनाथन सैम्पसन मुझे संदेह है कि वह फ़ाइल नाम की परवाह करता है। वह किसी भी फाइल को पकड़ना चाहता है, इसे डेटाबेस में रखता है, और अगले स्थान पर जाता है। –

उत्तर

19

यह करना चाहिए:

<?php 
$h = opendir('./'); //Open the current directory 
while (false !== ($entry = readdir($h))) { 
    if($entry != '.' && $entry != '..') { //Skips over . and .. 
     echo $entry; //Do whatever you need to do with the file 
     break; //Exit the loop so no more files are read 
    } 
} 
?> 

readdir

निर्देशिका में अगले प्रविष्टि का नाम देता है। प्रविष्टियों को उस क्रम में वापस कर दिया जाता है जिसमें वे फाइल सिस्टम द्वारा संग्रहीत होते हैं।

+0

मैं बजाय 1.3 एम बार चेक करने के बजाय डेटाबेस में '.and' .. 'डालना चाहता हूं। –

+0

@ सैमी डिंडेन, उस चेक में काफी समय नहीं लगेगा, विशेष रूप से डिस्क से फ़ाइल पढ़ने और डेटाबेस में संग्रहीत करने की तुलना में ... – Zombaya

+2

फिर भी, ओवरहेड को केवल दो कॉल चलाकर बचाया जा सकता है (हर छोटी मदद) लूप से पहले 'readdir', '.' और' ..' हमेशा पहली प्रविष्टियां होती हैं। – connec

2

readdir चाल करेगा। उस पृष्ठ पर परीक्षा की जांच करें लेकिन लूप में रीडडियर कॉल करने की बजाय, बस इसे एक बार करें। आपको निर्देशिका में पहली फाइल मिल जाएगी।

नोट: आपको "।", "..", और सर्वर के आधार पर अन्य समान प्रतिक्रियाएं मिल सकती हैं, इसलिए हो सकता है कि आप कम से कम लूप चाहें जब तक कि आपको वैध फ़ाइल न मिल जाए।

5

बस निर्देशिका इटरेटर प्राप्त करने और पहली प्रविष्टि एक फाइल है कि देखने के लिए:

foreach(new DirectoryIterator('.') as $file) 
{ 
    if ($file->isFile()) { 
     echo $file, "\n"; 
     break; 
    }   
} 

यह भी सुनिश्चित करता है कि आपके कोड एक जैसा कि आप उम्मीद की तुलना में कुछ अन्य फ़ाइल-प्रणाली व्यवहार पर निष्पादित किया जाता है।

DirectoryIterator और SplFileInfo देखें।

+0

क्या यह पूरी निर्देशिका सामग्री को सरणी में लोड नहीं करता है? काइल बचने की कोशिश कर रहा है।जब आपके पास फ़ोल्डर में हजारों फाइलें हों तो इससे कोई फर्क पड़ सकता है। – skibulk

+1

@skibulk: नहीं, यह नहीं है, यह ** DirectoryIterator ** पर पुनरावृत्त करता है जो एक सरणी नहीं बल्कि एक वस्तु है। यह प्रभावी रूप से रोकता है कि आप क्या डरते हैं: एक सरणी। – hakre

+0

कूल। मैं 'foreach'ing arrays के लिए प्रयोग किया जाता है। तो जब 'foreach'' DirectoryIterator' की अगली अनुक्रमणिका तक पहुंचता है, तो यह वास्तव में एक विधि (IE getNextFile()) का आविष्कार कर रहा है? अजीब। – skibulk

0

क्या आप पहली निर्देशिका या पहली फ़ाइल वापस करना चाहते हैं? दोनों? इस का उपयोग करें:

2 तर्क के साथ "pickfirst" समारोह बनाने

function pickfirst($address,$file) { // $file=false >> pick first dir , $file=true >> pick first file 
$h = opendir($address); 

    while (false !== ($entry = readdir($h))) { 

      if($entry != '.' && $entry != '..' && (($file==false && !is_file($address.$entry)) || ($file==true && is_file($address.$entry))) ) 
      { return $entry; break; } 

} // end while 
} // end function 

अगर आप पहले निर्देशिका अपना पता गलत पर सेट $file में लेने चाहते हैं और अगर आप पहले लेने चाहते हैं (पते और मोड निर्देशिका या फ़ाइल?) अपने पते में फ़ाइल $file को सत्य पर सेट करें।

शुभकामनाएं :)

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

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