Perl语言入门笔记 第十二章 文件测试

=pod
第十二章    文件测试

 文件测试操作符:
    -e:判断文件是否存在
    在创建新文件程序之前,应先检查指定的文件是否已经存在,以免意外覆盖重要的电子表格或是宝贵的生日档案。要达到此目的,我们可以用-e文件测试操作符来测试文件是否存在:
        die "Oops ! A file called '$filename' already exists.\n";
            if -e $filename;

    -M:测试文件
        warn "Config file is looking pretty old\n";
            if -M CONFIG > 28;
        CONFIG:为文件句柄,来检查CONFIG 28内是否改变过

    -s:查找硬盘中的文件的大小
        my @original_files = qw /fred barney betty wilma pebbles dino bamm-bamm /;
        my @big_old_files; #将要移到备份磁带上的既大且旧的文件列表
        foreach my $filename (@original_files)
        {
            push @big_old_files, $filename
                if -s $filename > 100_000 and -A $filename > 90;
        }

 文件测试操作符    意义
 -r              文件或目录,对目前(有效的)用户或组来说是可读的
 -w              文件或目录,对目前(有效的)用户或组来说是可写的
 -x              文件或目录,对目前(有效的)用户或组来说是可执行的
 -o              文件或目录,由目前(有效的)用户拥有
 -R              文件或目录,对实际的用户或组来说是可读的
 -W              文件或目录,对实际的用户或组来说是可写的
 -X              文件或目录,对实际的用户或组来说是可执行的
 -O              文件或目录,由实际的用户拥有
 -e              文件或目录是存在的
 -z              文件存在且没有美容(对目录来说永远为假)
 -s              文件或目录存在而且有内容(返回值是以字节为单位的文件的大小)
 -f              是普通文件
 -d              是目录
 -l              是符号链接
 -S              是socket类型的文件
 -p              是命名管道,也就是先入先出队列
 -b              是块设备(比如默哥可挂载的磁盘)
 -c              是字符设备文件(比如某个IO设备)
 -u              文件或目录设置了setuid位
 -g              文件或目录设置了setgid位
 -k              文件或目录设置了sticky位
 -t              文件句柄是tty设备,(类似系统函数isatty()的测试,不能对文件名进行此测试)
 -T              看起来像文本文件
 -B              看起来像二进制文件
 -M              最后一次被修改后至今的天数
 -A              最后一次被访问后至今的天数
 -C              最后一次文件节点编号(inode)被变更后至今的天数

 上面的所谓的有效用户,指的是"负责"运行这个程序的人


my $size_in_k = (-s) / 1024; #获取文件是kb大小


测试同一文件的多项属性:
    可读又可写
    if(-r $file and -w $file)
    {   ... }
 虚拟文件句柄_(下划线)
    if(-r $file and -w _)
    {   ... }

    if(-r $file)
    {   print "The file is readable\n"; }
    if(-w _)
    {   print "The file is wirtable\n"; }


 栈式文件测试操作符:
    if(-w -r $file)
    {   print "The file is both readable and writeable!\n"; }
    use 5.010;
    if(-r -w -x -o -d $file)
    {   print "My directory is readable, writeable, and executable!\n"; }

    if(-d $file and -s _ < 512)
    {   print "The directory is less than 512 bytes!\n" }

 stat和lstat函数:
    my($dev, $ino, $mode, $nlink, $uid, $gid, $rdev, $size, $atime, $mtime, $ctime, $blockzies, $blocks) = stat($fileName);


 $dev, $ino
    即文件所在的设备与文件的inode编号,这个编号决定了这个文件的唯一性,会想发给文件的编号,即使他有多个不同的文件名(使用应链接!\n)


    $mode:
        文件的权限集合

    $nlink:
        文件或目录的硬链接数,也就是这个条目有多少个真实名称

    $uid和$gid
        以数值形式表示文件拥有者的用户ID及组ID

    $size:
        以字节为单位文件大小,和-s文件操作符的返回值相同

    $atime,$mtime,$ctime:
        三种时间戳,但在这里是以系统的时间格式来表示

    localtime函数:
        my $timestamp = 118060098;
        my $date = localtime $timestamp;

    在列表上下文中,localtime会返回一个数字元素组成的列表,但其中有些元素不是你想要的:
        my ($sec, $min, $hour, $day, $mon, $year, $wday, $yday, $yday, $listdst)
            =   localtime $timestamp;

使用字符串:


=cut


简单测试:

#!/usr/bin/perl -w
use strict;

my $filename = "./file1";

die "Oops ! A file called $filename already exists.\n"
    if -e $filename;


posted @ 2015-09-21 01:58  笑面浮屠  阅读(135)  评论(0编辑  收藏  举报