gpt4 book ai didi

perl - 为什么 Perl 的 readdir() 缓存目录条目?

转载 作者:行者123 更新时间:2023-12-04 14:20:09 24 4
gpt4 key购买 nike

出于某种原因,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 的文档, readdirclosedir没有提到某种缓存机制。 “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);

给你
>>>.>>>.>>>..

Without the rewinddir you get

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

Just testing with C, I get the same thing:

#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
>>> .
>>> ..
>>> 香蕉
$ ./a.out
>>> .
>>> ..

关于perl - 为什么 Perl 的 readdir() 缓存目录条目?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2911951/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com