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

前端之家收集整理的这篇文章主要介绍了为什么Perl的readdir()缓存目录条目?前端之家小编觉得挺不错的,现在分享给大家,也给大家做个参考。
出于某种原因,Perl使用 readdir缓存我正在尝试读取的目录条目:
  1. opendir(SNIPPETS,$dir_snippets); # or die...
  2. while ( my $snippet = readdir(SNIPPETS) )
  3. { print ">>>".$snippet."\n"; }
  4. closedir(SNIPPETS);

由于我的目录包含两个文件test.pl和test.man,我期待以下输出

  1. .
  2. ..
  3. test.pl
  4. test.man

不幸的是,Perl返回了许多已经消失的文件,例如因为我试图重命名它们.将test.pl移动到test.yeah后,Perl将返回以下列表:

  1. .
  2. ..
  3. test.pl
  4. test.yeah
  5. test.man

这种奇怪行为的原因是什么? opendir,readdirclosedir的文档没有提到某种缓存机制. “ls -l”清楚地只列出了两个文件.

解决方法

opendir的结果似乎是在调用它时在目录中的文件列表.如果您更改了目录,则需要调用rewinddir:
  1. my $dir_snippets = "/tmp/fruit";
  2. system ("rm -rf $dir_snippets");
  3. mkdir $dir_snippets or die $!;
  4. my $banana = "$dir_snippets/banana";
  5. system ("touch $banana");
  6. opendir(SNIPPETS,$dir_snippets); # or die...
  7. while ( my $snippet = readdir(SNIPPETS) ) {
  8. if (-f $banana) {
  9. unlink $banana;
  10. rewinddir SNIPPETS;
  11. }
  12. print ">>>".$snippet."\n";
  13. }
  14. closedir(SNIPPETS);

给你

  1. >>>.
  2. >>>.
  3. >>>..

没有rewinddir你得到

  1. >>>.
  2. >>>..
  3. >>>banana

只用C测试,我得到同样的东西:

  1. #include <stdlib.h>
  2. #include <stdio.h>
  3. #include <string.h>
  4. #include <sys/types.h>
  5. #include <dirent.h>
  6. #include <errno.h>
  7.  
  8. int main ()
  9. {
  10. DIR * fruit;
  11. struct dirent * file;
  12.  
  13. fruit = opendir ("/tmp/fruit");
  14. if (! fruit) {
  15. fprintf (stderr,"opendir Failed: %s\n",strerror (errno));
  16. exit (EXIT_FAILURE);
  17. }
  18. while (file = readdir (fruit)) {
  19. unlink ("/tmp/fruit/banana");
  20. printf (">>> %s\n",file->d_name);
  21. }
  22. closedir (fruit);
  23. }

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

  1. $./a.out
  2. >>> .
  3. >>> ..
  4. >>> banana
  5. $./a.out
  6. >>> .
  7. >>> ..

猜你在找的Perl相关文章