出于某种原因,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”清楚地只列出了两个文件。
答案 0 :(得分:9)
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 >>> . >>> ..