文件描述符,文件句柄文件变量访问模式文件名出错函数与变量$!文件缓冲其它文件打开函数读文件命令行参数写文件文件权限随机访问文件测试文件状态文件操作文件链接目录访问小结
一、文件描述符在原来linux系统中访问文件时用来代表文件的数字,它是系统资源,系统会限制打开的文件描述符的数量.Perl中只在某些系统调用时才使用它.
文件句柄:功能同文件描述符一样,但是与文件描述符不是同一个东西,perl使用文件句柄来代表文件.文件描述符与文件句柄互相转化:文件句柄=>文件描述符:fileno(F):返回文件描述符.文件描述符=>文件句柄:open(F,”>&n”).
二、文件变量文件:存放在磁盘上,永久存储数据,用于读写访问。访问前要先打开文件,结束后关闭文件.open(HANDLE,”>filename”)||die $!; 成功返回非零,失败返回零.
HANDLE:文件句柄,文件变量.用来代表操作的文件,以字母开头,字母,数字,下划线组成.不以$,@,%类的符号开头,可能与关键字if等重名,故一般用大写字母.
缺省打开的句柄STDIN,STDOUT,STDERR,文件描述符为0,1,2。不用调用open就可以直接访问.STDIN:键盘输入,控制台.STDOUT:屏幕,显示屏.STDERR:错误输出,显示屏.
三、访问模式文件用于读还是写,在第二个参数前的>位置。(1) 只读:<或省略,若文件不存在则打开失败,如open(F,”file”),open(F,”<file”)(2) 只写:>,为写打开文件,若文件不存在则创建,文件存在则清除内容再写.(3) 追加:>>,为写打开文件,若文件不存在则创建,文件存在则不清除内容,在原内容后追加。(4) 读写:+<,可读可写,若文件不存在则打开失败,不清除内容,不追加,直接复盖原文件.(5) 读写+>,可读可写,若文件不存在则创建,文件存在则清除内容再写.(6) 读写+>》,可读可写,若文件不存在则创建,文件存在则追加.(7) 管道: | open(F,”| cat >hello”),把文件F的输出(print F $a)作为|后的输入. open(F,”comm|”),把comm的输出作为F的输入。
四、文件名
Filename:open的最后一个参数,可以是相对路径或绝对路径的文件名.说明:1.不含路径的文件名前的空格可以忽略,但有路径的文件名不能。2.可以用变量来代表文件名.3.特殊的文件名如”>file”,可能使读变成写,使用变量代表文件名时注意过滤文件名.4.复制文件句柄:open(F,”>&STDOUT”),写入F文件的内容都变成写入屏幕STDOUT5.使用文件描述符:open(F,”>&3″),把文件描述符复制成句柄,或者”>&=3″6.open() 打开成功返回非零,失败返回零.open()||die “error $!” 成功时不执行die,失败时执行.
五、错误输出函数与错误变量.
1.die($errstr):向STDERR输出指示错误信息的串,然后退出程序。2.warn($errstr):向STDERR输出警告信息,不退出程序。3.$!最后一次错误的信息,一般与die,warn结合使用。说明:die($str)中$str最后不是/n时,输出自动添加at程序名line行号,如die(“can’t open”),输出can’t open at myprog line 13,加上/n如”can’t open”时没有添加信息.
六、文件缓冲close(F):最后要关闭文件,隐含关闭文件,重打开已经打开的,先关闭再打开,程序退出自动关闭,这时才真正写文件。
1.文件缓冲:通常为带缓冲的文件写,写文件时,系统先写到称为文件缓冲区的内存中,缓冲满再真正写入磁盘.一般在关闭时缓冲内容才开始写入磁盘,称为刷新,结果是用tail -f是看不到不断地输出内容的。2.无文件缓冲:每次写都真正写入磁盘中,不经过内存,频繁写入可能影响性能.3.设置$|变量决定是否有文件缓冲,$|=1无缓冲,但只对当前输出文件有效,如STDOUT,设置另外的文件要先用select(F).4.select(F)设置当前文件,返回原文件句柄,设置完再select(OLD)返回原文件. 缓冲 无缓冲打开: open,sysopen sysopen关闭: close读: <>,readline sysread写: print syswrite定位: tell,seek sysseek
其它文件打开函数间接文件变量:用简单变量来表示文件变量,代表文件变量名$a=”F”;open($a,”mode”,”path”);
七、读文件1.常见方式:$line=<file> 读一行到line,指针后移一行,缺省读到$_中 $/=’/n’ 为行分隔符,遇到它则为一行结束,行包含$/2.用chomp($s)去除此标志,行尾不含$/则不去除字符.3.可设置$/为其它字符串,遇到$/为行结束,chomp去除此字符串.
@array=<file> 文件内容全部读出,每行为一个元素,含回车,当从STDIN中读时,可省略为<>.read(F,$in,len[,$offset] 读入$insysread(F,$in,len[,$offset])getc(F)读一个字符
八、命令行参数
@ARGV:全局,$ARGV[0] 是第一个参数,不是程序名,<>是对$ARGV的引用.@ARGV一旦赋值,原值丢失.1.第一次看到<>时,打开以$ARGV[0]中的文件,无参数则打开STDIN读,所以可以省略.2.shift(@ARGV)元素数量减少一个.3.<>读打开的文件中的所有行4.再读第二个参数表示的文件5.文件尾检测:eof和eof(),文件结束返回真.@ARGV=(“file1″,”file2″)while($line=<>){if(eof){print ‘eof’;}}读取file到末尾时,下一循环打开下一文件,每次读完一个文件输入出eofif(eof()){print ‘eof’;}所有文件都读完才输出eof
九、写文件print F (“str”)
F文件句柄,后面为空格,省略F为STDOUTstr输出内容,可用单引号’,不进行变量替换,不加引号,计算出变量的值再输出。()可省略,这是函数的特点.
printf(“format str”,$a,$b….),格化化串包含%m.nf的格式指示,后面依次是相应的值列表。write 用于格式化输出,不是read的相应操作.syswrite(F,$data,length,$offset) 同sysread
十、文件权限和随机访问
chmod(mode,filelist)mode=4位8进制数,unix中的文件owner,组,其它的设置。chown(userid,groupid,filelist)改变文件的用户与组。umask(maskval):返回原mask,unix中的umask值设置。
文件指针:tell(F):当前位置.seek(F,distance,pos):定位到指定位置.F文件句柄,pos=0相对文件头,1相对当前位置,2相对文件尾.distance相对pos表示的位置多少字节.
十一、文件测试
-op expr if(-e “filea”){print STDERR(“file1/n”):} 文件是否存在.
-b是否为块设备 -c是否为字符设备-d是否为目录 -e文件是否存在-f是否为普通文件 -g是否设置了setgid位-k是否设置了sticky位 -l是否为符号连接-o是否拥有该文件 -p是否为管道-r是否可读 -s是否非空-t是否表示终端 -u是否设置setuid位-w是否可写 -x是否可执行 -z是否为空文件-A距上次访问多长时间-B是否为二进制文件-C距上次访问文件的inode多长时间-M距上次修改多长的时间-O是否只为”真正的用户”所拥有-R是否只有”真正的用户”可读-S是否为socket -T是否为文本文件-W是否只有”真正的用户”可写-X是否只有”真正的用户”可执行-s返回文件长度,-A-C-M返回的天数.
十二、文件状态
stat(file):参数可为文件名,也可为文件句柄,返回文件状态的列表。
编号 名字 unix windows0 dev 设备号 c:=2,d:=31 ino 索引节点 总是02 mode 模式 无3 nlink 链接号 04 uid 文件所有者 05 gid 文件组 06 rdev 特殊文件信息,设备类型 驱动器号7 size 文件大小 文件大小8 atime 上次访问时间 上次访问时间9 mtime 上次修改时间 上次修改时间10 ctime inode修改时间 文件创建时间11 blksz 磁盘块大小 012 Blocks 文件的块数 0
utime(acctime,modtime,filelist):修改时间戳,修改访问时间,返回成功修改的文件数.
十三、文件操作
Glob:@a=glob(“*.txt”)返回与模式匹配的所有文件目录,如果赋值给简单变量则一次返回一个文件。参数可以是文件名或目录.只能接受有限的文件数,报文件太多错误,用shell来执行。因为用shell来解释执行,故运行速度慢。另一种形式是@a=<*.txt>是古老的用法,推荐用glob.
truncate(file,lenght):将文件的长度减少到length字节,如果文件长度已经小于length,则不做任何事.其中filename可以为文件名,也可以为文件变量.
rename(old,new)成功=1 可以从一个目录移动到另一个目录,不检查new是否存在,可能破坏文件.-e “file2″||rename(file1,file2) 先检查再移动
十四、文件链接
link(文件名,链接名)创建现有文件的链接-硬链接,file是被链接的文件,newlink是被创建的链接。成功返回真,失败返回假.当删除这两个链接中的一个时,还可以用另一个来访问该文件。
synlink符号链接(文件名,链接名)创建现有文件的符号链接,即指向文件名,而不是指向文件本身,当原文件被删除(如:被unlinke函数删除),则被创建链接不可用,除非再创建一个与原被链接的文件同名的文件.Readlink(linkname)跟踪符号链接,如果linkname为符号链接文件,返回其实际指向的文件。否则返回空串。
unlink(filelist)=成功删除的文件数,删除文件或$_中的文件,参数为文件名列表,返回值为实际删除的文件数目.此函数之所以叫unlink而不叫delete是因为它实际所做的是删除文件的链接。
十五、目录操作
opendir(dirvar,dirname) 打开目录,查看某目录中文件列表时也要先打开,再操作,再关闭,参数为:dirvar:目录变量,dirname:目录名,成功返回真值,失败返回假。closedir(dir):关闭目录readdir(dir):对数组返回所有文件和目录,对简单变量每次返回一个文件或目录,不含当前路径。chdir(dir):改变目录,运行完返回原目录,成功为真,失败为假.telldir(dir):当前目录位置seekdir(dir,loc):到指定位置rewinddir(dir):目录位置指向目录第一项.mkdir(dirname,permission):创建目录(当前目录,访问权限)rmdir(dirname):只能删除空目录,成功则返回真,失败返回假.
十六、小结
1.概念:描述符,句柄,缓冲,访问模式,权限,文件状态.2.文件访问:打开,关闭,读,写,随机访问3.文件操作:测试,改名,截取,链接.4.目录操作:同文件.5.相关技术:错误函数及变量,文件打开函数,命令行参数,glob的扩展.