第十一章 文件系统
一、文件输入/输出函数这里简单回顾一下,再讲一些前面未提到的函数。open:允许程序访问文件 close:终止文件访问 print:文件写入字符串 write:向文件写入格式化信息 printf:格式化字符串并输出到文件
1 : #!/usr/local/bin/perl结果输出如下:
2 :
3 : open (WOUT, "w|");
4 : $time = <WOUT>;
5 : $time =~ s/^ *//;
6 : $time =~ s/ .*//;
7 :; # skip headings line
8 : @users =;
9 : close (WOUT);
10: foreach $user (@users) {
11: $user =~ s/ .*//;
12: }
13: print ("Current time: $time");
14: print ("Users logged on:\n");
15: $prevuser = "";
16: foreach $user (sort @users) {
17: if ($user ne $prevuser) {
18: print ("\t$user");
19: $prevuser = $user;
20: }
21: }
Current time: 4:25pmw命令列出当前时间、系统负载和登录的用户,以及每个用户的作业时间和当前运行的命令,如:
Users logged on:
dave
kilroy
root
zarquon
上例中从w命令的输出中取出所需的信息:当前时间和登录的用户名。第3行运行w命令,此处对open的调用指定w的输出用作程序的输入,用文件变量WOUT来访问该输入。第4行读取第一行信息,即:4:25pm up 1 day, 6:37, 6 users, load average: 0.79, 0.36, 0.28 User tty login@ idle JCPU PCPU what dave ttyp0 2:26pm 27 3 w kilroy ttyp1 9:01am 2:27 1:04 11 -csh kilroy ttyp2 9:02am 43 1:46 27 rn root ttyp3 4:22pm 2 -csh zarquon ttyp4 1:26pm 4 43 16 cc myprog.c kilroy ttyp5 9:03am 2:14 48 /usr/games/hack
1: #!/usr/local/bin/perl运行后,文件file1中的内容为:
2:
3: open (STDOUT, ">file1") || die ("open STDOUT failed");
4: open (STDERR, ">&STDOUT") || die ("open STDERR failed");
5: print STDOUT ("line 1\n");
6: print STDERR ("line 2\n");
7: close (STDOUT);
8: close (STDERR);
1 : #!/usr/local/bin/perl程序运行后,文件file1中内容为:
2 :
3 : open (STDOUT, ">file1") || die ("open STDOUT failed");
4 : open (STDERR, ">&STDOUT") || die ("open STDERR failed");
5 : $| = 1;
6 : select (STDERR);
7 : $| = 1;
8 : print STDOUT ("line 1\n");
9 : print STDERR ("line 2\n");
10: close (STDOUT);
11: close (STDERR);
1: #!/usr/local/bin/perl运行结果如下:
2:
3: while ($line = <>) {
4: print ($line);
5: if (eof) {
6: print ("-- end of current file --\n");
7: }
8: }
$ program file1 file2下面把eof改为eof(),第二个程序为:
This is a line from the first file.
Here is the last line of the first file.
-- end of current file --
This is a line from the second and last file.
Here is the last line of the last file.
-- end of current file --
$
1: #!/usr/local/bin/perl运行结果如下:
2:
3: while ($line = <>) {
4: print ($line);
5: if (eof()) {
6: print ("-- end of output --\n");
7: }
8: }
$ program file1 file2这时,只有所有文件都读过了,eof()才返回真,如果只是多个文件中前几个的末尾,返回值为假,因为还有要读取的输入。
This is a line from the first file.
Here is the last line of the first file.
This is a line from the second and last file.
Here is the last line of the last file.
-- end of output --$
1: #!/usr/local/bin/perl2、跳过和重读数据
2:
3: &open_file("INFILE", "", "file1");
4: &open_file("OUTFILE", ">", "file2");
5: while ($line = &read_from_file("INFILE")) {
6: &print_to_file("OUTFILE", $line);
7: }
8:
9: sub open_file {
10: local ($filevar, $filemode, $filename) = @_;
11:
12: open ($filevar, $filemode . $filename) ||
13: die ("Can't open $filename");
14: }
15: sub read_from_file {
16: local ($filevar) = @_;
17:
18: <$filevar>;
19: }
20: sub print_to_file {
21: local ($filevar, $line) = @_;
22:
23: print $filevar ($line);
24: }
函数名 | seek |
调用语法 | seek (filevar, distance, relative_to); |
解说 | 在文件中向前/后移动,有三个参数: 1、filevar,文件变量 2、distance,移动的字节数,正数向前移动,负数往回移动 3、reletive_to,值可为0、1或2。为0时,从文件头开始移动,为1时,相对于当前位置(将要读的下一行)移动,为2时,相对于文件末尾移动。 运行成功返回真(非零值),失败则返回零,常与tell函数合用。 |
函数名 | tell |
调用语法 | tell (filevar); |
解说 | 返回从文件头到当前位置的距离。 注意: 1、seek和tell不能用于指向管道的文件变量。 2、seek和tell中文件变量参数可使用表达式。 |
函数名 | read |
调用语法 | read (filevar, result, length, skipval); |
解说 | read函数设计得与UNIX的fread函数等效,可以读取任意长度的字符(字节)存入一个简单变量。其参数有四个: 1、filevar:文件变量 2、result:存贮结果的简单变量(或数组元素) 3、length:读取的字节数 4、skipval:可选项,指定读文件之前跳过的字节数。 返回值为实际读取的字节数,如果已到了文件末尾,则返回零,如果出错,则返回空串。 |
函数名 | sysread |
调用语法 | sysread (filevar, result, length, skipval); |
解说 | 更快的读取数据,与UNIX函数read等效,参数与read相同。 |
函数名 | syswrite |
调用语法 | syswrite (filevar, data, length, skipval); |
解说 | 更快的写入数据,与UNIX函数write等效,参数: 1、filevar:将要写入的文件 2、data:存贮要写入数据的变量 3、length:要写入的字节数 4、skipval写操作之前跳过的字节数。 |
函数名 | getc |
调用语法 | $char = getc (infile); |
解说 | 从文件中读取单个字符。 |
函数名 | binmode |
调用语法 | binmode (filevar); |
解说 | 当你的系统(如类DOS系统)对文本文件和二进制文件有所区别时使用。必须在打开文件后、读取文件前使用。 |
函数名 | mkdir |
调用语法 | mkdir (dirname, permissions); |
解说 | 创建新目录,参数为: 1、dirname:将要创建的目录名,可以为字符串或表达式 2、permissions:8进制数,指定目录的访问权限,其值和意义见下表,权限的组合方法为将相应的值相加。 |
值 | 权限 |
4000 | 运行时设置用户ID |
2000 | 运行时设置组ID |
1000 | 粘贴位 |
0400 | 拥有者读权限 |
0200 | 拥有者写权限 |
0100 | 拥有者执行权限 |
0040 | 组读权限 |
0020 | 组写权限 |
0010 | 组执行权限 |
0004 | 所有人读权限 |
0002 | 所有人写权限 |
0001 | 所有人执行权限 |
函数名 | chdir |
调用语法 | chdir (dirname); |
解说 | 改变当前工作目录。参数dirname可以为字符串,也可以为表达式。 |
函数名 | opendir |
调用语法 | opendir (dirvar, dirname); |
解说 | 打开目录,与下面几个函数合用,可查看某目录中文件列表。参数为: 1、dirvar:目录变量,与文件变量类似 2、dirname:目录名,可为字符串或表达式 成功返回真值,失败返回假。 注:程序中可用同名的目录变量和文件变量,根据环境确定取成分。 |
函数名 | closedir |
调用语法 | closedir (mydir); |
解说 | 关闭打开的目录。 |
函数名 | readdir |
调用语法 | readdir (mydir); |
解说 | 赋给简单变量时,每次赋予一个文件或子目录名,对数组则赋予全部文件和子目录名。 |
函数名 | telldir |
调用语法 | location = telldir (mydir); |
解说 | 象在文件中前后移动一样,telldir和下面的seekdir用于在目录列表中前后移动。 |
函数名 | seekdir |
调用语法 | seekdir(mydir, location); |
解说 | location必须为telldir返回的值。 |
函数名 | rewinddir |
调用语法 | rewinddir (mydir); |
解说 | 将读取目录的位置重置回开头,从而可以重读目录列表。 |
函数名 | rmdir |
调用语法 | rmdir (dirname); |
解说 | 删除空目录。成功则返回真(非零值),失败返回假(零值)。 |
函数名 | rename |
调用语法 | rename (oldname, newname); |
解说 | 改变文件名或移动到另一个目录中,参数可为字符串或表达式。 |
函数名 | unlink |
调用语法 | num = unlink (filelist); |
解说 | 删除文件。参数为文件名列表,返回值为实际删除的文件数目。 此函数之所以叫unlink而不叫delete是因为它实际所做的是删除文件的链接。 |
函数名 | link |
调用语法 | link (newlink, file); |
解说 | 创建现有文件的链接--硬链接,file是被链接的文件,newlink是被创建的链接。 成功返回真,失败返回假。 当删除这两个链接中的一个时,还可以用另一个来访问该文件。 |
函数名 | symlink |
调用语法 | symlink (newlink, file); |
解说 | 创建现有文件的符号链接,即指向文件名,而不是指向文件本身。参数和返回值同上。 当原文件被删除(如:被unlinke函数删除),则被创建链接不可用,除非再创建一个与原被链接的文件同名的文件。 |
函数名 | readlink |
调用语法 | filename = readlink (linkname); |
解说 | 如果linkname为符号链接文件,返回其实际指向的文件。否则返回空串。 |
函数名 | chmod |
调用语法 | chmod (permissions, filelist); |
解说 | 改变文件的访问权限。参数为: 1、permissions为将要设置的权限,其含义见上述mkdir中权限表 2、filelist为欲改变权限的文件列表 |
函数名 | chown |
调用语法 | chown (userid, groupid, filelist); |
解说 | 改变文件的属主,有三个参数: 1、userid:新属主的(数字)ID号 2、groupid:新的组(数字)ID号,-1为保留原组 3、filelist:欲改变属主的文件列表 |
函数名 | umask |
调用语法 | oldmaskval = umask (maskval); |
解说 | 设置文件访问权限掩码,返回值为当前掩码。 |
函数名 | truncate |
调用语法 | truncate (filename, length); |
解说 | 将文件的长度减少到length字节。如果文件长度已经小于length,则不做任何事。其中filename可以为文件名,也可以为文件变量 |
函数名 | stat |
调用语法 | stat (file); |
解说 | 获取文件状态。参数file可为文件名也可为文件变量。返回列表元素依次为: |
函数名 | lstat |
调用语法 | lstat (file); |
解说 | 与stat类似,区别是将file看作是符号链接。 |
函数名 | time |
调用语法 | currtime = time(); |
解说 | 返回从1970年1月1日起累计秒数。 |
函数名 | gmtime |
调用语法 | timelist = gmtime (timeval); |
解说 | 将由time, stat 或 -A 和 -M 文件测试操作符返回的时间转换成格林威治时间。返回列表元素依次为: 详见UNIX的gmtime帮助。 |
函数名 | localtime |
调用语法 | timelist = localtime (timeval); |
解说 | 与gmtime类似,区别为将时间值转换为本地时间。 |
函数名 | utime |
调用语法 | utime (acctime, modtime, filelist); |
解说 | 改变文件的最后访问时间和最后更改时间。例如: $acctime = -A "file1"; $modtime = -M "file1"; @filelist = ("file2", "file3"); utime ($acctime, $modtime, @filelist); |
函数名 | fileno |
调用语法 | filedesc = fileno (filevar); |
解说 | 返回文件的内部UNIX文件描述。参数filevar为文件变量。 |
函数名 | fcntl flock |
调用语法 | fcntl (filevar, fcntlrtn, value); flock (filevar, flockop); |
解说 | 详见同名UNIX函数帮助。 |
函数名 | dbmopen |
调用语法 | dbmopen (array, dbmfilename, permissions); |
解说 | 将关联数组与DBM文件相关联。参数为: 1、array:所用关联数组 2、dbmfilename:将打开的DBM文件名 3、访问权限,详见mkdir |
函数名 | dbmclose |
调用语法 | dbmclose (array); |
解说 | 关闭DBM文件,拆除关联数组与之的关系。 |