出于某种原因,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
- >>> .
- >>> ..