第十一章 文件系統(tǒng)
一、文件輸入/輸出函數(shù)這里簡(jiǎn)單回顧一下,再講一些前面未提到的函數(shù)。open:允許程序訪問(wèn)文件 close:終止文件訪問(wèn) print:文件寫入字符串 write:向文件寫入格式化信息 printf:格式化字符串并輸出到文件
1 : #!/usr/local/bin/perl結(jié)果輸出如下:
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命令列出當(dāng)前時(shí)間、系統(tǒng)負(fù)載和登錄的用戶,以及每個(gè)用戶的作業(yè)時(shí)間和當(dāng)前運(yùn)行的命令,如:
Users logged on:
dave
kilroy
root
zarquon
上例中從w命令的輸出中取出所需的信息:當(dāng)前時(shí)間和登錄的用戶名。第3行運(yùn)行w命令,此處對(duì)open的調(diào)用指定w的輸出用作程序的輸入,用文件變量WOUT來(lái)訪問(wèn)該輸入。第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運(yùn)行后,文件file1中的內(nèi)容為:
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程序運(yùn)行后,文件file1中內(nèi)容為:
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運(yùn)行結(jié)果如下:
2:
3: while ($line = <>) {
4: print ($line);
5: if (eof) {
6: print ("-- end of current file --\n");
7: }
8: }
$ program file1 file2下面把eof改為eof(),第二個(gè)程序?yàn)椋?br>
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運(yùn)行結(jié)果如下:
2:
3: while ($line = <>) {
4: print ($line);
5: if (eof()) {
6: print ("-- end of output --\n");
7: }
8: }
$ program file1 file2這時(shí),只有所有文件都讀過(guò)了,eof()才返回真,如果只是多個(gè)文件中前幾個(gè)的末尾,返回值為假,因?yàn)檫有要讀取的輸入。
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、跳過(guò)和重讀數(shù)據(jù)
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: }
函數(shù)名 | seek |
調(diào)用語(yǔ)法 | seek (filevar, distance, relative_to); |
解說(shuō) | 在文件中向前/后移動(dòng),有三個(gè)參數(shù): 1、filevar,文件變量 2、distance,移動(dòng)的字節(jié)數(shù),正數(shù)向前移動(dòng),負(fù)數(shù)往回移動(dòng) 3、reletive_to,值可為0、1或2。為0時(shí),從文件頭開(kāi)始移動(dòng),為1時(shí),相對(duì)于當(dāng)前位置(將要讀的下一行)移動(dòng),為2時(shí),相對(duì)于文件末尾移動(dòng)。 運(yùn)行成功返回真(非零值),失敗則返回零,常與tell函數(shù)合用。 |
函數(shù)名 | tell |
調(diào)用語(yǔ)法 | tell (filevar); |
解說(shuō) | 返回從文件頭到當(dāng)前位置的距離。 注意: 1、seek和tell不能用于指向管道的文件變量。 2、seek和tell中文件變量參數(shù)可使用表達(dá)式。 |
函數(shù)名 | read |
調(diào)用語(yǔ)法 | read (filevar, result, length, skipval); |
解說(shuō) | read函數(shù)設(shè)計(jì)得與UNIX的fread函數(shù)等效,可以讀取任意長(zhǎng)度的字符(字節(jié))存入一個(gè)簡(jiǎn)單變量。其參數(shù)有四個(gè): 1、filevar:文件變量 2、result:存貯結(jié)果的簡(jiǎn)單變量(或數(shù)組元素) 3、length:讀取的字節(jié)數(shù) 4、skipval:可選項(xiàng),指定讀文件之前跳過(guò)的字節(jié)數(shù)。 返回值為實(shí)際讀取的字節(jié)數(shù),如果已到了文件末尾,則返回零,如果出錯(cuò),則返回空串。 |
函數(shù)名 | sysread |
調(diào)用語(yǔ)法 | sysread (filevar, result, length, skipval); |
解說(shuō) | 更快的讀取數(shù)據(jù),與UNIX函數(shù)read等效,參數(shù)與read相同。 |
函數(shù)名 | syswrite |
調(diào)用語(yǔ)法 | syswrite (filevar, data, length, skipval); |
解說(shuō) | 更快的寫入數(shù)據(jù),與UNIX函數(shù)write等效,參數(shù): 1、filevar:將要寫入的文件 2、data:存貯要寫入數(shù)據(jù)的變量 3、length:要寫入的字節(jié)數(shù) 4、skipval寫操作之前跳過(guò)的字節(jié)數(shù)。 |
函數(shù)名 | getc |
調(diào)用語(yǔ)法 | $char = getc (infile); |
解說(shuō) | 從文件中讀取單個(gè)字符。 |
函數(shù)名 | binmode |
調(diào)用語(yǔ)法 | binmode (filevar); |
解說(shuō) | 當(dāng)你的系統(tǒng)(如類DOS系統(tǒng))對(duì)文本文件和二進(jìn)制文件有所區(qū)別時(shí)使用。必須在打開(kāi)文件后、讀取文件前使用。 |
函數(shù)名 | mkdir |
調(diào)用語(yǔ)法 | mkdir (dirname, permissions); |
解說(shuō) | 創(chuàng)建新目錄,參數(shù)為: 1、dirname:將要?jiǎng)?chuàng)建的目錄名,可以為字符串或表達(dá)式 2、permissions:8進(jìn)制數(shù),指定目錄的訪問(wèn)權(quán)限,其值和意義見(jiàn)下表,權(quán)限的組合方法為將相應(yīng)的值相加。 |
值 | 權(quán)限 |
4000 | 運(yùn)行時(shí)設(shè)置用戶ID |
2000 | 運(yùn)行時(shí)設(shè)置組ID |
1000 | 粘貼位 |
0400 | 擁有者讀權(quán)限 |
0200 | 擁有者寫權(quán)限 |
0100 | 擁有者執(zhí)行權(quán)限 |
0040 | 組讀權(quán)限 |
0020 | 組寫權(quán)限 |
0010 | 組執(zhí)行權(quán)限 |
0004 | 所有人讀權(quán)限 |
0002 | 所有人寫權(quán)限 |
0001 | 所有人執(zhí)行權(quán)限 |
函數(shù)名 | chdir |
調(diào)用語(yǔ)法 | chdir (dirname); |
解說(shuō) | 改變當(dāng)前工作目錄。參數(shù)dirname可以為字符串,也可以為表達(dá)式。 |
函數(shù)名 | opendir |
調(diào)用語(yǔ)法 | opendir (dirvar, dirname); |
解說(shuō) | 打開(kāi)目錄,與下面幾個(gè)函數(shù)合用,可查看某目錄中文件列表。參數(shù)為: 1、dirvar:目錄變量,與文件變量類似 2、dirname:目錄名,可為字符串或表達(dá)式 成功返回真值,失敗返回假。 注:程序中可用同名的目錄變量和文件變量,根據(jù)環(huán)境確定取成分。 |
函數(shù)名 | closedir |
調(diào)用語(yǔ)法 | closedir (mydir); |
解說(shuō) | 關(guān)閉打開(kāi)的目錄。 |
函數(shù)名 | readdir |
調(diào)用語(yǔ)法 | readdir (mydir); |
解說(shuō) | 賦給簡(jiǎn)單變量時(shí),每次賦予一個(gè)文件或子目錄名,對(duì)數(shù)組則賦予全部文件和子目錄名。 |
函數(shù)名 | telldir |
調(diào)用語(yǔ)法 | location = telldir (mydir); |
解說(shuō) | 象在文件中前后移動(dòng)一樣,telldir和下面的seekdir用于在目錄列表中前后移動(dòng)。 |
函數(shù)名 | seekdir |
調(diào)用語(yǔ)法 | seekdir(mydir, location); |
解說(shuō) | location必須為telldir返回的值。 |
函數(shù)名 | rewinddir |
調(diào)用語(yǔ)法 | rewinddir (mydir); |
解說(shuō) | 將讀取目錄的位置重置回開(kāi)頭,從而可以重讀目錄列表。 |
函數(shù)名 | rmdir |
調(diào)用語(yǔ)法 | rmdir (dirname); |
解說(shuō) | 刪除空目錄。成功則返回真(非零值),失敗返回假(零值)。 |
函數(shù)名 | rename |
調(diào)用語(yǔ)法 | rename (oldname, newname); |
解說(shuō) | 改變文件名或移動(dòng)到另一個(gè)目錄中,參數(shù)可為字符串或表達(dá)式。 |
函數(shù)名 | unlink |
調(diào)用語(yǔ)法 | num = unlink (filelist); |
解說(shuō) | 刪除文件。參數(shù)為文件名列表,返回值為實(shí)際刪除的文件數(shù)目。 此函數(shù)之所以叫unlink而不叫delete是因?yàn)樗鼘?shí)際所做的是刪除文件的鏈接。 |
函數(shù)名 | link |
調(diào)用語(yǔ)法 | link (newlink, file); |
解說(shuō) | 創(chuàng)建現(xiàn)有文件的鏈接--硬鏈接,file是被鏈接的文件,newlink是被創(chuàng)建的鏈接。 成功返回真,失敗返回假。 當(dāng)刪除這兩個(gè)鏈接中的一個(gè)時(shí),還可以用另一個(gè)來(lái)訪問(wèn)該文件。 |
函數(shù)名 | symlink |
調(diào)用語(yǔ)法 | symlink (newlink, file); |
解說(shuō) | 創(chuàng)建現(xiàn)有文件的符號(hào)鏈接,即指向文件名,而不是指向文件本身。參數(shù)和返回值同上。 當(dāng)原文件被刪除(如:被unlinke函數(shù)刪除),則被創(chuàng)建鏈接不可用,除非再創(chuàng)建一個(gè)與原被鏈接的文件同名的文件。 |
函數(shù)名 | readlink |
調(diào)用語(yǔ)法 | filename = readlink (linkname); |
解說(shuō) | 如果linkname為符號(hào)鏈接文件,返回其實(shí)際指向的文件。否則返回空串。 |
函數(shù)名 | chmod |
調(diào)用語(yǔ)法 | chmod (permissions, filelist); |
解說(shuō) | 改變文件的訪問(wèn)權(quán)限。參數(shù)為: 1、permissions為將要設(shè)置的權(quán)限,其含義見(jiàn)上述mkdir中權(quán)限表 2、filelist為欲改變權(quán)限的文件列表 |
函數(shù)名 | chown |
調(diào)用語(yǔ)法 | chown (userid, groupid, filelist); |
解說(shuō) | 改變文件的屬主,有三個(gè)參數(shù): 1、userid:新屬主的(數(shù)字)ID號(hào) 2、groupid:新的組(數(shù)字)ID號(hào),-1為保留原組 3、filelist:欲改變屬主的文件列表 |
函數(shù)名 | umask |
調(diào)用語(yǔ)法 | oldmaskval = umask (maskval); |
解說(shuō) | 設(shè)置文件訪問(wèn)權(quán)限掩碼,返回值為當(dāng)前掩碼。 |
函數(shù)名 | truncate |
調(diào)用語(yǔ)法 | truncate (filename, length); |
解說(shuō) | 將文件的長(zhǎng)度減少到length字節(jié)。如果文件長(zhǎng)度已經(jīng)小于length,則不做任何事。其中filename可以為文件名,也可以為文件變量 |
函數(shù)名 | stat |
調(diào)用語(yǔ)法 | stat (file); |
解說(shuō) | 獲取文件狀態(tài)。參數(shù)file可為文件名也可為文件變量。返回列表元素依次為: |
函數(shù)名 | lstat |
調(diào)用語(yǔ)法 | lstat (file); |
解說(shuō) | 與stat類似,區(qū)別是將file看作是符號(hào)鏈接。 |
函數(shù)名 | time |
調(diào)用語(yǔ)法 | currtime = time(); |
解說(shuō) | 返回從1970年1月1日起累計(jì)秒數(shù)。 |
函數(shù)名 | gmtime |
調(diào)用語(yǔ)法 | timelist = gmtime (timeval); |
解說(shuō) | 將由time, stat 或 -A 和 -M 文件測(cè)試操作符返回的時(shí)間轉(zhuǎn)換成格林威治時(shí)間。返回列表元素依次為: 詳見(jiàn)UNIX的gmtime幫助。 |
函數(shù)名 | localtime |
調(diào)用語(yǔ)法 | timelist = localtime (timeval); |
解說(shuō) | 與gmtime類似,區(qū)別為將時(shí)間值轉(zhuǎn)換為本地時(shí)間。 |
函數(shù)名 | utime |
調(diào)用語(yǔ)法 | utime (acctime, modtime, filelist); |
解說(shuō) | 改變文件的最后訪問(wèn)時(shí)間和最后更改時(shí)間。例如: $acctime = -A "file1"; $modtime = -M "file1"; @filelist = ("file2", "file3"); utime ($acctime, $modtime, @filelist); |
函數(shù)名 | fileno |
調(diào)用語(yǔ)法 | filedesc = fileno (filevar); |
解說(shuō) | 返回文件的內(nèi)部UNIX文件描述。參數(shù)filevar為文件變量。 |
函數(shù)名 | fcntl flock |
調(diào)用語(yǔ)法 | fcntl (filevar, fcntlrtn, value); flock (filevar, flockop); |
解說(shuō) | 詳見(jiàn)同名UNIX函數(shù)幫助。 |
函數(shù)名 | dbmopen |
調(diào)用語(yǔ)法 | dbmopen (array, dbmfilename, permissions); |
解說(shuō) | 將關(guān)聯(lián)數(shù)組與DBM文件相關(guān)聯(lián)。參數(shù)為: 1、array:所用關(guān)聯(lián)數(shù)組 2、dbmfilename:將打開(kāi)的DBM文件名 3、訪問(wèn)權(quán)限,詳見(jiàn)mkdir |
函數(shù)名 | dbmclose |
調(diào)用語(yǔ)法 | dbmclose (array); |
解說(shuō) | 關(guān)閉DBM文件,拆除關(guān)聯(lián)數(shù)組與之的關(guān)系。 |