|
第十一章??文件系統(tǒng)
by
flamephoenix
?
一、文件輸入/輸出函數(shù)
? 1、基本I/O函數(shù)
??? 1)open函數(shù)
??? 2)用open重定向輸入
??? 3)文件重定向
??? 4)指定讀寫(xiě)權(quán)限
??? 5)close函數(shù)
??? 6)print, printf和write函數(shù)
??? 7)select函數(shù)
??? 8)eof函數(shù)
??? 9)間接文件變量
? 2、跳過(guò)和重讀數(shù)據(jù)
? 3、系讀寫(xiě)函數(shù)
? 4、用getc讀取字符
? 5、用binmode讀取二進(jìn)制文件 二、目錄處理函數(shù)
? 1、mkdir
? 2、chdir
? 3、opendir
? 4、closedir
? 5、readdir
? 6、telldir
? 7、seekdir
? 8、rewinddir
? 9、rmdir 三、文件屬性函數(shù)
? 1、文件重定位函數(shù)
? 2、鏈接和符號(hào)鏈接函數(shù)
? 3、文件許可權(quán)函數(shù)
? 4、其他屬性函數(shù) 四、使用DBM文件
????本章所講的函數(shù)多數(shù)使用了UNIX操作系統(tǒng)的特性,在非UNIX系統(tǒng)中,一些函數(shù)可能沒(méi)有定義或有不同的工作方式,使用時(shí)請(qǐng)查看Perl聯(lián)機(jī)文檔。 一、文件輸入/輸出函數(shù) ????本節(jié)講述從文件中讀取信息和向文件寫(xiě)入信息的內(nèi)置庫(kù)函數(shù)。 1、基本I/O函數(shù) ????一些I/O函數(shù)在前面的章節(jié)中已有講述,如
- open:允許程序訪問(wèn)文件
- close:終止文件訪問(wèn)
- print:文件寫(xiě)入字符串
- write:向文件寫(xiě)入格式化信息
- printf:格式化字符串并輸出到文件
????這里簡(jiǎn)單回顧一下,再講一些前面未提到的函數(shù)。 1)open函數(shù) ????open函數(shù)將文件變量與某文件聯(lián)系起來(lái),提供訪問(wèn)文件的接口,例如:open(MYVAR,
"/u/file");
如果文件打開(kāi)成功,則返回非零值,否則返回零。缺省地,open打開(kāi)文件用以讀取其內(nèi)容,若想打開(kāi)文件以寫(xiě)入內(nèi)容,則在文件名前加個(gè)大于號(hào):open(MYVAR,
">/u/file"); 向已有的文件末尾添加內(nèi)容用兩個(gè)大于號(hào):open(MYVAR, ">>/u/file");
若想打開(kāi)文件作為數(shù)據(jù)導(dǎo)向的命令,則在命令前加上管道符(|):open(MAIL, "|mail dave"); 2)用open重定向輸入 ????可以把打開(kāi)的文件句柄用作向程序輸入數(shù)據(jù)的命令,方法是在命令后加管道符(|),如: ????open(CAT,
"cat file*|"); ????對(duì)open的調(diào)用運(yùn)行命令cat file*
,此命令創(chuàng)建一個(gè)臨時(shí)文件,這個(gè)文件的內(nèi)容是所有以file打頭的文件的內(nèi)容連接而成,此文件看作輸入文件,可用文件變量CAT訪問(wèn),如: ????$input
= ; ????下面的例子使用命令w的輸出來(lái)列出當(dāng)前登錄的所有用戶(hù)名。
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: }
????結(jié)果輸出如下:
Current time: 4:25pm Users logged on: ? dave ?
kilroy ? root ? zarquon
????w命令列出當(dāng)前時(shí)間、系統(tǒng)負(fù)載和登錄的用戶(hù),以及每個(gè)用戶(hù)的作業(yè)時(shí)間和當(dāng)前運(yùn)行的命令,如:
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
????上例中從w命令的輸出中取出所需的信息:當(dāng)前時(shí)間和登錄的用戶(hù)名。第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 ????接下來(lái)的兩行從這行中抽取出時(shí)間。首先,第5行刪除起始的空格,然后第6行刪去除時(shí)間和結(jié)尾換行符之間的所有字符,存入變量$time。 ????第7行從WOUT讀取第二行,這行中無(wú)有用信息,故不作處理。第8行把剩下的行賦給數(shù)組@users,然后第9行關(guān)閉WOUT,終止運(yùn)行w命令的進(jìn)程。 ????@users中的每個(gè)元素都是一行用戶(hù)信息,因?yàn)楸境绦蛑恍枰啃械牡谝粋€(gè)單詞,即用戶(hù)名,故10~12行去掉除換行符外的其它字符,這一循環(huán)結(jié)束后,@users中只剩下用戶(hù)名的列表。 ????第13行輸出存貯在$time中的時(shí)間,注意這時(shí)print不需要加上換行符,因?yàn)?time中有。16~21行對(duì)@users中的用戶(hù)名排序并輸出。因?yàn)橥粋€(gè)用戶(hù)可以多次登錄,所以用$preuser存貯輸出的最后一個(gè)用戶(hù)名,下次輸出數(shù)組元素$user時(shí),如果其與$preser相等,則不輸出。 3)文件重定向 ????許多UNIX
shell可以把標(biāo)準(zhǔn)輸出文件(STDOUT)和標(biāo)準(zhǔn)錯(cuò)誤文件(STDERR)都重定向到同一個(gè)文件,例如在Bourne
Shell(sh)中,命令 ????$ foo > file1
2>&1 ????運(yùn)行命令foo并把輸出到標(biāo)準(zhǔn)輸出文件和標(biāo)準(zhǔn)錯(cuò)誤文件的內(nèi)容存貯到文件file1中。下面是用Perl實(shí)現(xiàn)這一功能的例子:
1: #!/usr/local/bin/perl 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);
????運(yùn)行后,文件file1中的內(nèi)容為: ????
line 2 ???? line
1 ????可以看到,這兩行并未按我們想象的順序存貯,為什么呢?我們來(lái)分析一下這段程序。 ????第3行重定向標(biāo)準(zhǔn)輸出文件,方法是打開(kāi)文件file1將它與文件變量STDOUT關(guān)聯(lián),這也關(guān)閉了標(biāo)準(zhǔn)輸出文件。第4行重定向標(biāo)準(zhǔn)錯(cuò)誤文件,參數(shù)>&STDOUT告訴Perl解釋器使用已打開(kāi)并與STDOUT關(guān)聯(lián)的文件,即文件變量STDERR指向與STDOUT相同的文件。第5、6行分別向STDOUT和STDERR寫(xiě)入數(shù)據(jù),因?yàn)檫@兩個(gè)文件變量指向同一個(gè)文件,故兩行字符串均寫(xiě)到文件file1中,但順序卻是錯(cuò)誤的,怎么回事呢? ????問(wèn)題在于UNIX對(duì)輸出的處理上。當(dāng)使用print(或其它函數(shù))寫(xiě)入STDOUT等文件時(shí),UNIX操作系統(tǒng)真正所做的是把數(shù)據(jù)拷貝到一片特殊的內(nèi)存即緩沖區(qū)中,接下來(lái)的輸出操作繼續(xù)寫(xiě)入緩沖區(qū)直到寫(xiě)滿,當(dāng)緩沖區(qū)滿了,就把全部數(shù)據(jù)實(shí)際輸出。象這樣先寫(xiě)入緩沖區(qū)再把整個(gè)緩沖區(qū)的內(nèi)容輸出比每次都實(shí)際輸出所花費(fèi)的時(shí)間要少得多,因?yàn)橐话銇?lái)說(shuō),I/O比內(nèi)存操作慢得多。 ????程序結(jié)束時(shí),任何非空的緩沖區(qū)都被輸出,然而,系統(tǒng)為STDOUT和STDERR分別維護(hù)一片緩沖區(qū),并且先輸出STDERR的內(nèi)容,因此存貯在STDERR的緩沖區(qū)中的內(nèi)容line
2出現(xiàn)在存貯在STDOUT的緩沖區(qū)中的內(nèi)容line
1之前。 ????為了解決這個(gè)問(wèn)題,可以告訴Perl解釋器不對(duì)文件使用緩沖,方法為: ????
1、用select函數(shù)選擇文件 ????
2、把值1賦給系統(tǒng)變量$| ????系統(tǒng)變量$|指定文件是否進(jìn)行緩沖而不管其是否應(yīng)該使用緩沖。如果$|為非零值則不使用緩沖。$|與系統(tǒng)變量$~和$^協(xié)同工作,當(dāng)未調(diào)用select函數(shù)時(shí),$|影響當(dāng)前缺省文件。下例保證了輸出的次序:
1 : #!/usr/local/bin/perl 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);
????程序運(yùn)行后,文件file1中內(nèi)容為: ????
line 1 ???? line
2 ????第5行將$|賦成1,告訴Perl解釋器當(dāng)前缺省文件不進(jìn)行緩沖,因?yàn)槲凑{(diào)用select,當(dāng)前的缺省文件為重定向到文件file1的STDOUT。第6行將當(dāng)前缺省文件設(shè)為STDERR,第7行又設(shè)置$|為1,關(guān)掉了重定向到file1的標(biāo)準(zhǔn)錯(cuò)誤文件的緩沖。由于STDOUT和STDERR的緩沖均被關(guān)掉,向其的輸出立刻被寫(xiě)到文件中,因此line
1出現(xiàn)在第一行。 4)指定讀寫(xiě)權(quán)限 ????打開(kāi)一個(gè)既可讀又可寫(xiě)的文件方法是在文件名前加上"+>",如下: ????
open (READWRITE,
"+>file1"); ????此語(yǔ)句打開(kāi)既可讀又可寫(xiě)的文件file1,即可以重寫(xiě)其中的內(nèi)容。文件讀寫(xiě)操作最好與庫(kù)函數(shù)seek和tell一起使用,這樣可以跳到文件任何一點(diǎn)。 ????注:也可用前綴"+<"指定可讀寫(xiě)權(quán)限。 5)close函數(shù) ????用于關(guān)閉打開(kāi)的文件。當(dāng)用close關(guān)閉管道,即重定向的命令時(shí),程序等待重定向的命令結(jié)束,如: ????
open (MYPIPE, "cat file*|"); ???? close
(MYPIPE); ????當(dāng)關(guān)閉此文件變量時(shí),程序暫停運(yùn)行,直到命令cat
file*運(yùn)行完畢。 6)print,
printf和write函數(shù) ????print是這三個(gè)函數(shù)中最簡(jiǎn)單的,它向指定的文件輸出,如果未指定,則輸出到當(dāng)前缺省文件中,如: ????
print ("Hello, there!\n"); ???? print OUTFILE
("Hello,
there!\n"); ????第一句輸出到當(dāng)前缺省文件中,若未調(diào)用select,則為STDOUT。第二句輸出到由文件變量OUTFILE指定的文件中。 ????printf函數(shù)先格式化字符串再輸出到指定文件或當(dāng)前缺省文件中,如: ????
printf OUTFILE (“You owe me %8.2f",
$owing); ????此語(yǔ)句取出變量$owing的值并替換掉串中的%8.2f,%8.2f是域格式的例子,把$owing的值看作浮點(diǎn)數(shù)。 ????write函數(shù)使用輸出格式把信息輸出到文件中,如: ????
select (OUTFILE); ???? $~ =
"MYFORMAT"; ????
write; ????關(guān)于printf和write,詳見(jiàn)《第x章 格式化輸出》。 7)select函數(shù) ????select函數(shù)將通過(guò)參數(shù)傳遞的文件變量指定為新的當(dāng)前缺省文件,如: ????
select
(MYFILE); ????這樣,MYFILE就成了當(dāng)前缺省文件,當(dāng)對(duì)print、write和printf的調(diào)用未指定文件時(shí),就輸出到MYFILE中。 8)eof函數(shù) ????eof函數(shù)查看最后一次讀文件操作是否為文件最后一個(gè)記錄,如果是,則返回非零值,如果文件還有內(nèi)容,返回零。 ????一般情況下,對(duì)eof的調(diào)用不加括號(hào),因?yàn)閑of和eof()是等效的,但與<>操作符一起使用時(shí),eof和eof()就不同了。現(xiàn)在我們來(lái)創(chuàng)建兩個(gè)文件,分別叫做file1和file2。file1的內(nèi)容為: ????
This is a line from the first file. ???? Here is
the last line of the first
file. ????file2的內(nèi)容為: ????
This is a line from the second and last file. ????
Here is the last line of the last
file. ????下面就來(lái)看一下eof和eof()的區(qū)別,第一個(gè)程序?yàn)椋?br>
1: #!/usr/local/bin/perl 2: 3: while ($line = <>)
{ 4: ? print ($line); 5: ? if (eof) { 6: ?
? print ("-- end of current file --\n"); 7: ? } 8: }
????運(yùn)行結(jié)果如下:
$ program file1 file2 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 -- $
????下面把eof改為eof(),第二個(gè)程序?yàn)椋?br>
1: #!/usr/local/bin/perl 2: 3: while ($line = <>)
{ 4: ? print ($line); 5: ? if (eof()) { 6: ?
? print ("-- end of output --\n"); 7: ? } 8: }
????運(yùn)行結(jié)果如下:
$ program file1 file2 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 --$
????這時(shí),只有所有文件都讀過(guò)了,eof()才返回真,如果只是多個(gè)文件中前幾個(gè)的末尾,返回值為假,因?yàn)檫€有要讀取的輸入。 9)間接文件變量 ????對(duì)于上述各函數(shù)open, close,
print, printf, write,
select和eof,都可以用簡(jiǎn)單變量來(lái)代替文件變量,這時(shí),簡(jiǎn)單變量中所存貯的字符串就被看作文件變量名,下面就是這樣一個(gè)例子,此例很簡(jiǎn)單,就不解釋了。需要指出的是,函數(shù)open,
close, write, select和eof還允許用表達(dá)式來(lái)替代文件變量,表達(dá)式的值必須是字符串,被用作文件變量名。
1: #!/usr/local/bin/perl 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: }
2、跳過(guò)和重讀數(shù)據(jù)
函數(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á)式。 |
3、系統(tǒng)讀寫(xiě)函數(shù)
函數(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ō) |
更快的寫(xiě)入數(shù)據(jù),與UNIX函數(shù)write等效,參數(shù): 1、filevar:將要寫(xiě)入的文件 2、data:存貯要寫(xiě)入數(shù)據(jù)的變量 3、length:要寫(xiě)入的字節(jié)數(shù) 4、skipval寫(xiě)操作之前跳過(guò)的字節(jié)數(shù)。 |
4、用getc讀取字符
函數(shù)名 |
getc |
調(diào)用語(yǔ)法 |
$char = getc (infile); |
解說(shuō) |
從文件中讀取單個(gè)字符。 |
5、用binmode讀取二進(jìn)制文件
函數(shù)名 |
binmode |
調(diào)用語(yǔ)法 |
binmode (filevar); |
解說(shuō) |
當(dāng)你的系統(tǒng)(如類(lèi)DOS系統(tǒng))對(duì)文本文件和二進(jìn)制文件有所區(qū)別時(shí)使用。必須在打開(kāi)文件后、讀取文件前使用。 |
二、目錄處理函數(shù)
函數(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è)置用戶(hù)ID ? |
2000 |
運(yùn)行時(shí)設(shè)置組ID |
1000 |
粘貼位 |
0400 |
擁有者讀權(quán)限 |
0200 |
擁有者寫(xiě)權(quán)限 |
0100 |
擁有者執(zhí)行權(quán)限 |
0040 |
組讀權(quán)限 |
0020 |
組寫(xiě)權(quán)限 |
0010 |
組執(zhí)行權(quán)限 |
0004 |
所有人讀權(quán)限 |
0002 |
所有人寫(xiě)權(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:目錄變量,與文件變量類(lèi)似 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ù) 1、文件重定位函數(shù)
函數(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í)際所做的是刪除文件的鏈接。 |
2、鏈接和符號(hào)鏈接函數(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í)際指向的文件。否則返回空串。 |
3、文件許可權(quán)函數(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)前掩碼。 |
4、其它屬性函數(shù)
函數(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è)備
- 內(nèi)部參考號(hào)(inode)
- 訪問(wèn)權(quán)限
- 硬鏈接數(shù)
- 屬主的(數(shù)字)ID
- 所屬組的(數(shù)字)ID
- 設(shè)備類(lèi)型(如果file是設(shè)備的話)
- 文件大小(字節(jié)數(shù))
- 最后訪問(wèn)時(shí)間
- 最后修改時(shí)間最后改變狀態(tài)時(shí)間
- I/O操作最佳塊大小
- 分配給該文件的塊數(shù)
|
函數(shù)名 |
lstat |
調(diào)用語(yǔ)法 |
lstat (file); |
解說(shuō) |
與stat類(lèi)似,區(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í)間。返回列表元素依次為:
- 秒
- 分鐘
- 小時(shí),0~23
- 日期
- 月份,0~11(一月~十二月)
- 年份
- 星期,0~6(周日~周六)
- 一年中的日期,0~364
- 是否夏令時(shí)的標(biāo)志
詳見(jiàn)UNIX的gmtime幫助。
|
函數(shù)名 |
localtime |
調(diào)用語(yǔ)法 |
timelist = localtime (timeval); |
解說(shuō) |
與gmtime類(lèi)似,區(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ù)幫助。 |
四、使用DBM文件 ???Perl中可用關(guān)聯(lián)數(shù)組來(lái)訪問(wèn)DBM文件,所用函數(shù)為dbmopen和dbmclose,在Perl5中,已用tie和untie代替。
函數(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)系。 |
|
|