加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 大数据 > 正文

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

发布时间:2020-12-15 22:04:33 所属栏目:大数据 来源:网络整理
导读:出于某种原因,Perl使用 readdir缓存我正在尝试读取的目录条目: opendir(SNIPPETS,$dir_snippets); # or die...while ( my $snippet = readdir(SNIPPETS) ) { print "".$snippet."n"; }closedir(SNIPPETS); 由于我的目录包含两个文件test.pl和test.man,我期
出于某种原因,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: %sn",strerror (errno));
        exit (EXIT_FAILURE);
    }
    while (file = readdir (fruit)) {
        unlink ("/tmp/fruit/banana");
        printf (">>> %sn",file->d_name);
    }
    closedir (fruit);
}

给出以下内容(在用“touch”创建文件“banana”之后):

$./a.out 
>>> .
>>> ..
>>> banana
$./a.out 
>>> .
>>> ..

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读