第一章文件系统

文件系统

1.手动遍历文件系统;

问题:比如我的电脑硬盘某部分损坏了,当然也意味着存在该区域的文件也损坏了,但是系统还能正常运行,因此我需要将正常的文件都导出来。

解决方法:因为文件目录结构是树形结构,每个目录下可能是子目录也可能是文件,子目录下又可能包含各种目录所以我需要递归查询所有的目录直到没有目录为止,因为根目录下有很多子目录所以我也需要岁目录下的各个子目录进行遍历查询。

代码:    

 

1 #!/usr/bin/perl
  2 use v5.10;
  3 use warnings;
  4 #这个模块用于定位当前的工作目录
  5 use Cwd;
  6 #关闭I/O缓冲机
  7 $|=1;
  8 sub scanDirectory{
  9         my $workdir=shift;
 10         #开始前先保存当前目录;
 11         my $start_dir=cwd;
 12         chdir $workdir or die "Unable to enter dir $workdir:$!";
 13         opendir my $DIR,'.' or die "$!";
 14         my @names=readdir $DIR or die "$!";
 15         closedir $DIR;
 16         foreach my $name (@names){
 17                 next if($name eq '.');
 18                 next if($name eq '..');
 19                 my $full_name="$workdir/$name";
 20                 if(-d $full_name){
 21                         &scanDirectory($full_name);
 22                         next;
 23                 }       
 24                 &checkFile($full_name) or print cwd.'/'.$name."\n";
 25         }       
 26         chdir $start_dir or die "$!";
 27 }       
 28 sub checkFile {
 29         my $name=shift;
 30         print STDERR 'scanning'.cwd.'/'.$name."\n";
 31         #尝试读取此文件的目录信息
 32         my @stat=stat($name);
 33         if(!$stat[4] && !$stat[5] && !$stat[6] && !$stat[7] && !$stat[8]){
 34                 return 0;
 35         }       
 36         #尝试打开文件
 37         open my $T,'<',"$name" or return 0;
 38         #一次一个字节地读取文件,把读出的数据存入discard
 39         for(my $i=0;$i<$stat[7];$i++){
 40                 my $r=sysread($T,$discard,1);
 41                 if($r!=1){
 42                         close $T;
 43                         return 0;
 44                 }
 45         }
 46         close $T;
 47         return 1;
 48 }
 49 &scanDirectory('/usr/local');


你可能感兴趣的:(第一章文件系统)