出于某种原因,Perl使用
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
不幸的是,Perl返回了许多已经消失的文件,例如因为我试图重命名它们.将test.pl移动到test.yeah后,Perl将返回以下列表:
. .. test.pl test.yeah test.man
这种奇怪行为的原因是什么? opendir,readdir和closedir的文档没有提到某种缓存机制. “ls -l”清楚地只列出了两个文件.
解决方法
opendir的结果似乎是在调用它时在目录中的文件列表.如果您更改了目录,则需要调用rewinddir:
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你得到
>>>. >>>.. >>>banana
只用C测试,我得到同样的东西:
#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); }
给出以下内容(在用“touch”创建文件“banana”之后):
$./a.out >>> . >>> .. >>> banana $./a.out >>> . >>> ..