2010-05-26 11 views
6

किसी कारण पर्ल मैं कोशिश कर रहा हूँ निर्देशिका प्रविष्टियों कैशिंग रहता है के लिए readdir का उपयोग कर पढ़ने के लिए:पर्ल की readdir() कैश निर्देशिका प्रविष्टियों क्यों करता है?

opendir(SNIPPETS, $dir_snippets); # or die... 
while (my $snippet = readdir(SNIPPETS)) 
{ print ">>>".$snippet."\n"; } 
closedir(SNIPPETS); 

चूंकि मेरे निर्देशिका दो फ़ाइलों, test.pl और test.man होता है, मैं उम्मीद कर रहा हूँ निम्नलिखित उत्पादन:

. 
.. 
test.pl 
test.man 

दुर्भाग्य से पर्ल फ़ाइलें जिन्हें गायब हो गए, क्योंकि मैं उनका नाम बदल करने की कोशिश की उदाहरण के लिए, का एक बहुत कुछ देता है।

. 
.. 
test.pl 
test.yeah 
test.man 

इस अजीब व्यवहार के लिए कारण क्या है: मैं test.pltest.yeah को ले जाने के बाद पर्ल निम्नलिखित सूची प्रदान करेगा? opendir, readdir और closedir के लिए प्रलेखन कुछ प्रकार के कैशिंग तंत्र का उल्लेख नहीं करता है। "ls -l" स्पष्ट रूप से केवल दो फाइलों को सूचीबद्ध करता है।

+0

दोनों 'readline' और' readdir' पूर्व पढ़ सकते हैं और कैश। यह जानवर की प्रकृति है। – tchrist

उत्तर

9

opendir का परिणाम उन फ़ाइलों की एक सूची प्रतीत होता है जो निर्देशिका में थे जब इसे कहा जाता था। आप

 
>>>. 
>>>.. 
>>>banana 

बस सी के साथ परीक्षण कर, मैं एक ही बात मिल पाने

my $dir_snippets = "/tmp/fruit"; 
system ("rm -rf $dir_snippets"); 
mkdir $dir_snippets or die $!; 
my $banana = "$dir_snippets/banana"; 
system ("touch $banana"); 
opendir(SNIPPETS, $dir_snippets); # or die... 
while (my $snippet = readdir(SNIPPETS)) { 
    if (-f $banana) { 
     unlink $banana; 
     rewinddir SNIPPETS; 
    } 
    print ">>>".$snippet."\n"; 
} 
closedir(SNIPPETS); 

आप

 
>>>. 
>>>. 
>>>.. 

देता rewinddir के बिना: आप निर्देशिका में परिवर्तन यदि आप rewinddir कॉल करने के लिए की जरूरत है:

#include <stdlib.h> 
#include <stdio.h> 
#include <string.h> 
#include <sys/types.h> 
#include <dirent.h> 
#include <errno.h> 

int main() 
{ 
    DIR * fruit; 
    struct dirent * file; 

    fruit = opendir ("/tmp/fruit"); 
    if (! fruit) { 
     fprintf (stderr, "opendir failed: %s\n", strerror (errno)); 
     exit (EXIT_FAILURE); 
    } 
    while (file = readdir (fruit)) { 
     unlink ("/tmp/fruit/banana"); 
     printf (">>> %s\n", file->d_name); 
    } 
    closedir (fruit); 
} 

निम्नलिखित ("स्पर्श" के साथ फ़ाइल "केला" बनाने के बाद) देता है:

 
$ ./a.out 
>>> . 
>>> .. 
>>> banana 
$ ./a.out 
>>> . 
>>> .. 
+0

वाह, अब आकर्षण की तरह काम करता है, धन्यवाद! मैंने स्पीड के शीर्ष पर opendir() को सही, अच्छी तरह से पढ़ने के लिए readdir() की उम्मीद की। tl; dr: या तो readdir से पहले opendir कॉल करें या rewinddir का उपयोग करें यदि आप उस निर्देशिका में परिवर्तन की अपेक्षा करते हैं जिसे आप पढ़ रहे हैं। –

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