




版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進行舉報或認領(lǐng)
文檔簡介
1、第四章 文件操作與文件管理基本要求n掌握Linux文件系統(tǒng)的實現(xiàn),系統(tǒng)調(diào)用和標準I/O庫,文件屬性目錄的實現(xiàn)和操作,系統(tǒng)數(shù)據(jù)文件,文件鎖,高級I/O。Linux平臺下文件編程n 在在Linux平臺下對文件編程可以使用兩類函數(shù):平臺下對文件編程可以使用兩類函數(shù):Linux操作系統(tǒng)文件操作系統(tǒng)文件API;C語言語言I/O庫函數(shù)。庫函數(shù)。 n 前者依賴于前者依賴于Linux系統(tǒng)調(diào)用,后者實際上與操作系統(tǒng)是獨立的,因為在任何操系統(tǒng)調(diào)用,后者實際上與操作系統(tǒng)是獨立的,因為在任何操作系統(tǒng)下,使用作系統(tǒng)下,使用C語言語言I/O庫函數(shù)操作文件的方法都是相同的。庫函數(shù)操作文件的方法都是相同的。 Linux文件A
2、PI-創(chuàng)建n 創(chuàng)建創(chuàng)建int create(const char *filename, mode_t mode); 參數(shù)參數(shù)mode指定新建文件的存取權(quán)限,它同指定新建文件的存取權(quán)限,它同umask一起決定文一起決定文件的最終權(quán)限(件的最終權(quán)限(mode&umask).umask代表了文件在創(chuàng)建時需要去掉的一些存取權(quán)限。代表了文件在創(chuàng)建時需要去掉的一些存取權(quán)限。umask可可通過系統(tǒng)調(diào)用通過系統(tǒng)調(diào)用umask()來改變:來改變: int umask(int newmask); 該調(diào)用將該調(diào)用將umask設(shè)置為設(shè)置為newmask,然后返回舊的,然后返回舊的umask,它,它只影響讀、寫
3、和執(zhí)行權(quán)限。只影響讀、寫和執(zhí)行權(quán)限。Linux文件API-創(chuàng)建nmode可以是以下情況的組合,可以是以下情況的組合,可以通過上述宏進行可以通過上述宏進行“或或”邏輯產(chǎn)生標志。邏輯產(chǎn)生標志。 標志標志含義含義S_IRUSR 用戶可以讀用戶可以讀 S_IWUSR 用戶可以寫用戶可以寫 S_IXUSR 用戶可以執(zhí)行用戶可以執(zhí)行 S_IRWXU 用戶可以讀、寫、執(zhí)行用戶可以讀、寫、執(zhí)行 S_IRGRP 組可以讀組可以讀 S_IWGRP 組可以寫組可以寫S_IXGRP 組可以執(zhí)行組可以執(zhí)行 S_IRWXG 組可以讀寫執(zhí)行組可以讀寫執(zhí)行 Linux文件API-創(chuàng)建nmode可以是以下情況的組合,可以是以下
4、情況的組合,可以通過上述宏進行可以通過上述宏進行“或或”邏輯產(chǎn)生標志。邏輯產(chǎn)生標志。標志標志含義含義S_IROTH其他人可以讀其他人可以讀S_IWOTH其他人可以寫其他人可以寫S_IXOTH其他人可以執(zhí)行其他人可以執(zhí)行S_IRWXO其他人可以讀、寫、執(zhí)行其他人可以讀、寫、執(zhí)行S_ISUID設(shè)置用戶執(zhí)行設(shè)置用戶執(zhí)行IDS_ISGID設(shè)置組的執(zhí)行設(shè)置組的執(zhí)行IDLinux文件API-創(chuàng)建n 用數(shù)字來表示:用數(shù)字來表示:Linux總共用總共用5個數(shù)字來表示文件的各種權(quán)限:個數(shù)字來表示文件的各種權(quán)限:第一位表示設(shè)置用戶第一位表示設(shè)置用戶ID;第二位表示設(shè)置組第二位表示設(shè)置組ID;第三位表示用戶自己的權(quán)
5、限位;第三位表示用戶自己的權(quán)限位;第四位表示組的權(quán)限;第四位表示組的權(quán)限;最后一位表示其他人的權(quán)限。每個數(shù)字可以取最后一位表示其他人的權(quán)限。每個數(shù)字可以取1(執(zhí)行權(quán)限執(zhí)行權(quán)限)、2(寫寫權(quán)限權(quán)限)、4(讀權(quán)限讀權(quán)限)、0(無無)或者是這些值的和?;蛘呤沁@些值的和。Linux文件API-創(chuàng)建n用數(shù)字來表示:用數(shù)字來表示:例如,要創(chuàng)建一個用戶可讀、可寫、可執(zhí)行,但是組沒有權(quán)限,例如,要創(chuàng)建一個用戶可讀、可寫、可執(zhí)行,但是組沒有權(quán)限,其他人可以讀、可以執(zhí)行的文件,并設(shè)置用戶其他人可以讀、可以執(zhí)行的文件,并設(shè)置用戶ID位。位。應(yīng)該使用的模式是應(yīng)該使用的模式是1(設(shè)置用戶設(shè)置用戶ID)、0(不設(shè)置組不設(shè)
6、置組ID)、7(1+2+4,讀、,讀、寫、執(zhí)行寫、執(zhí)行)、0(沒有權(quán)限沒有權(quán)限)、5(1+4,讀、執(zhí)行,讀、執(zhí)行)即即10705Linux文件API-打開n 打開打開int open(const char *pathname, int flags);int open(const char *pathname, int flags, mode_t mode); 如果文件打開成功,如果文件打開成功,open函數(shù)會返回一個文件描述符,以后對該文件的所有操作函數(shù)會返回一個文件描述符,以后對該文件的所有操作就可以通過對這個文件描述符進行操作來實現(xiàn)。就可以通過對這個文件描述符進行操作來實現(xiàn)。open函數(shù)有
7、兩個形式,其中函數(shù)有兩個形式,其中pathname是要打開的文件名是要打開的文件名(包含路徑名稱,缺省是認包含路徑名稱,缺省是認為在當前路徑下面為在當前路徑下面) 。Linux文件API-打開n 打開打開flags可以是下面的一個值或者是幾個值的組合,可以是下面的一個值或者是幾個值的組合,O_RDONLY、O_WRONLY、O_RDWR三個標志只能使用任意的一個三個標志只能使用任意的一個。Linux文件API-打開n打開打開如果使用了如果使用了O_CREATE標志,則使用的函數(shù)是標志,則使用的函數(shù)是int open(const char *pathname,int flags,mode_t m
8、ode); 這時要指定這時要指定mode標志,用來表示文件的訪問權(quán)限。以標志,用來表示文件的訪問權(quán)限。以O(shè)_CREAT為標志的為標志的open實際上實現(xiàn)了文件創(chuàng)建的功能。實際上實現(xiàn)了文件創(chuàng)建的功能。例如:例如: open(test, O_CREAT, 10705); open(test, O_CREAT, S_IRWXU | S_IROTH | S_IXOTH | S_ISUID );Linux文件API-讀寫n 讀寫讀寫Linux中提供文件讀寫的系統(tǒng)調(diào)用是中提供文件讀寫的系統(tǒng)調(diào)用是read、write函數(shù):函數(shù): int read(int fd, const void *buf, size_
9、t length); int write(int fd, const void *buf, size_t length);參數(shù)參數(shù)buf為指向緩沖區(qū)的指針,為指向緩沖區(qū)的指針,length為緩沖區(qū)的大?。ㄒ宰止?jié)為為緩沖區(qū)的大?。ㄒ宰止?jié)為單位)。單位)。Linux文件API-讀寫n int read(int fd, const void *buf, size_t length);函數(shù)函數(shù)read實現(xiàn)從文件描述符實現(xiàn)從文件描述符fd所指定的文件中讀取所指定的文件中讀取length個字節(jié)到個字節(jié)到buf所指向的緩所指向的緩沖區(qū)中,返回值為實際讀取的字節(jié)數(shù)。沖區(qū)中,返回值為實際讀取的字節(jié)數(shù)。n int
10、 write(int fd, const void *buf, size_t length);函數(shù)函數(shù)write實現(xiàn)將把實現(xiàn)將把length個字節(jié)從個字節(jié)從buf指向的緩沖區(qū)中寫到文件描述符指向的緩沖區(qū)中寫到文件描述符fd所指向的所指向的文件中,返回值為實際寫入的字節(jié)數(shù)。文件中,返回值為實際寫入的字節(jié)數(shù)。Linux文件API-定位n定位:定位:對于隨機文件,我們可以隨機的指定位置讀寫,使用如下函數(shù)進行定位:對于隨機文件,我們可以隨機的指定位置讀寫,使用如下函數(shù)進行定位: int lseek(int fd, offset_t offset, int whence);lseek()將文件讀寫指針相
11、對將文件讀寫指針相對whence移動移動offset個字節(jié)。操作成功時,返回文件指針個字節(jié)。操作成功時,返回文件指針相對于文件頭的位置。參數(shù)相對于文件頭的位置。參數(shù)whence可使用下述值:可使用下述值:SEEK_SET:相對文件開頭:相對文件開頭SEEK_CUR:相對文件讀寫指針的當前位置:相對文件讀寫指針的當前位置SEEK_END:相對文件末尾:相對文件末尾Linux文件API-定位n 定位:定位:offset可取負值,例如下述調(diào)用可將文件指針相對當前位置向前移動可取負值,例如下述調(diào)用可將文件指針相對當前位置向前移動5個字節(jié):個字節(jié): lseek(fd, -5, SEEK_CUR);由于由
12、于lseek函數(shù)的返回值為文件指針相對于文件頭的位置,因此下列調(diào)用的返回值函數(shù)的返回值為文件指針相對于文件頭的位置,因此下列調(diào)用的返回值就是文件的長度:就是文件的長度: lseek(fd, 0, SEEK_END);Linux文件API-關(guān)閉n 關(guān)閉關(guān)閉當操作完成以后,要關(guān)閉文件,只要調(diào)用當操作完成以后,要關(guān)閉文件,只要調(diào)用close即可,其中即可,其中fd是是要關(guān)閉的文件描述符要關(guān)閉的文件描述符: int close(int fd);Linux文件API-編程實例n例程:編寫一個程序,在當前目錄下創(chuàng)建用戶可讀寫文件例程:編寫一個程序,在當前目錄下創(chuàng)建用戶可讀寫文件“hello.txt”,在其
13、中寫入,在其中寫入“Hello, software weekly”,關(guān)閉,關(guān)閉該文件。再次打開該文件,讀取其中的內(nèi)容并輸出在屏幕該文件。再次打開該文件,讀取其中的內(nèi)容并輸出在屏幕上。上。Linux文件API-編程實例#include /類型類型#include /獲取文件屬性獲取文件屬性#include /文件描述詞操作文件描述詞操作#include #define LENGTH 100main()int fd, len;char strLENGTH; fd = open(“hello.txt”, O_CREAT | O_RDWR, S_IRUSR | S_IWUSR); /* 創(chuàng)建并打開文件
14、創(chuàng)建并打開文件 ,以讀寫的方式打開,用戶可以讀、用戶可以寫,以讀寫的方式打開,用戶可以讀、用戶可以寫*/ if (fd) write(fd, Hello, Software Weekly, strlen(Hello, software weekly); /* 寫入寫入Hello, software weekly字符串字符串 */close(fd);fd = open(“hello.txt”, O_RDWR); /以讀寫方式打開以讀寫方式打開 len = read(fd, str, LENGTH); /* 讀取文件內(nèi)容讀取文件內(nèi)容 */strlen = 0;printf(%sn, str);cl
15、ose(fd); Linux文件API-編程實例n 編譯并運行,執(zhí)行結(jié)果如下編譯并運行,執(zhí)行結(jié)果如下rootdl root#gcc g o hello ./hello.crootdl root# ./helloHello,software weeklyC語言庫函數(shù)nC庫函數(shù)的文件操作實際上是獨立于具體的操作系統(tǒng)平臺庫函數(shù)的文件操作實際上是獨立于具體的操作系統(tǒng)平臺的,不管是在的,不管是在DOS、Windows、Linux中都是這些函數(shù)中都是這些函數(shù).C語言庫函數(shù)-創(chuàng)建和打開n 創(chuàng)建和打開創(chuàng)建和打開FILE *fopen(const char *path, const char *mode);fo
16、pen()實現(xiàn)打開指定文件,實現(xiàn)打開指定文件,參數(shù)參數(shù)path字符串包含欲打開的文件路字符串包含欲打開的文件路徑及文件名徑及文件名 ,mode為打開模式為打開模式.返回值:文件指針名。必須被說明為返回值:文件指針名。必須被說明為FILE類型的指針變量類型的指針變量 。C語言庫函數(shù)-創(chuàng)建和打開nC語言中支持的打開模式如下表,其中語言中支持的打開模式如下表,其中b用于區(qū)分二進制文用于區(qū)分二進制文件和文本文件,在件和文本文件,在DOS、Windows系統(tǒng)中是有區(qū)分的,但系統(tǒng)中是有區(qū)分的,但Linux不區(qū)分二進制文件和文本文件。不區(qū)分二進制文件和文本文件。標志標志含義含義r, rb以只讀方式打開以只讀
17、方式打開w, wb以只寫方式打開。如果文件不存在,則創(chuàng)建該文件,以只寫方式打開。如果文件不存在,則創(chuàng)建該文件,否則文件被截斷否則文件被截斷a, ab以追加方式打開。如果文件不存在,則創(chuàng)建該文件以追加方式打開。如果文件不存在,則創(chuàng)建該文件r+, r+b, rb+以讀寫方式打開以讀寫方式打開+, w+b, wh+以讀寫方式打開。如果文件不存在時,創(chuàng)建新文件,以讀寫方式打開。如果文件不存在時,創(chuàng)建新文件,否則文件被截斷否則文件被截斷a+, a+b, ab+以讀和追加方式打開。如果文件不存在,創(chuàng)建新文件以讀和追加方式打開。如果文件不存在,創(chuàng)建新文件C語言庫函數(shù)-讀寫n 讀寫:讀寫:C庫函數(shù)支持以字符、
18、字符串等為單位,支持按照某種格式進行文件的庫函數(shù)支持以字符、字符串等為單位,支持按照某種格式進行文件的讀寫,這一組函數(shù)為:讀寫,這一組函數(shù)為:int fgetc(FILE *stream); 從流中讀一個字符從流中讀一個字符int fputc(int c, FILE *stream);送一個字符到流中送一個字符到流中char *fgets(char *s, int n, FILE *stream);從流中讀取一字符串從流中讀取一字符串 int fputs(const char *s, FILE *stream);送一個字符串到流中送一個字符串到流中C語言庫函數(shù)-讀寫n int fprintf(
19、FILE *stream, const char *format, .);傳送格式化輸出到一個文件中,成功時返回轉(zhuǎn)換的字節(jié)數(shù),失敗傳送格式化輸出到一個文件中,成功時返回轉(zhuǎn)換的字節(jié)數(shù),失敗時返回一個負數(shù)。時返回一個負數(shù)。 fprintf( stream, %s%c, s, c ); fprintf( stream, %dn, i ); n int fscanf (FILE *stream, const char *format, .);從一個流中執(zhí)行格式化輸入從一個流中執(zhí)行格式化輸入 if (fscanf(stdin, %d, &i) printf(The integer read wa
20、s: %dn,i); C語言庫函數(shù)-讀寫n讀寫:讀寫:size_t fread(void *ptr, size_t size, size_t n, FILE *stream);size_t fwrite (const void *ptr, size_t size, size_t n, FILE *stream);fread()實現(xiàn)從流實現(xiàn)從流stream中讀取中讀取n個字段,每個字段為個字段,每個字段為size字節(jié),并將讀取的字段字節(jié),并將讀取的字段放入放入ptr所指的字符數(shù)組中,返回實際已讀取的字段數(shù)。所指的字符數(shù)組中,返回實際已讀取的字段數(shù)。write()實現(xiàn)從緩沖區(qū)實現(xiàn)從緩沖區(qū)ptr所指
21、的數(shù)組中把所指的數(shù)組中把n個字段寫到流個字段寫到流stream中,每個字段長中,每個字段長為為size個字節(jié),返回實際寫入的字段數(shù)。個字節(jié),返回實際寫入的字段數(shù)。C語言庫函數(shù)-定位n 定位定位 :C庫函數(shù)還提供了讀寫過程中的定位能力,這些函數(shù)包括:庫函數(shù)還提供了讀寫過程中的定位能力,這些函數(shù)包括:int fgetpos(FILE *stream, fpos_t *pos); /將文件流的文件位置指示符存儲在將文件流的文件位置指示符存儲在pos變量中變量中int fsetpos(FILE *stream, const fpos_t *pos);/將文件指針定位在將文件指針定位在pos指定的位置上
22、指定的位置上 n 返回值:成功返回返回值:成功返回0,否則返回非,否則返回非0。C語言庫函數(shù)-定位實例#include void main( void ) FILE *fp; fpos_t pos; char buffer50; if( (fp = fopen( test.txt, rb ) = NULL ) /*以以只讀方式打開名為只讀方式打開名為test.txt的文件的文件*/ printf( Trouble opening filen ); else pos = 10; /*設(shè)置設(shè)置pos值值*/ if( fsetpos( fp, &pos ) != 0 ) /*應(yīng)用應(yīng)用fset
23、pos函數(shù)將函數(shù)將文件指針文件指針fp按照按照pos指定的位置在文件中定位指定的位置在文件中定位*/ perror( fsetpos error );else /*從新定位的文件指針開始讀取從新定位的文件指針開始讀取16個字符到個字符到buffer緩沖區(qū)緩沖區(qū)*/fread( buffer, sizeof( char ), 16, fp );printf( 16 bytes at byte %ld: %.16sn, pos, buffer ); /*顯顯示結(jié)果示結(jié)果*/ fclose( fp ); C語言庫函數(shù)-定位實例說明n首先,程序以只讀方式打開名為首先,程序以只讀方式打開名為test.t
24、xt的文件。在這里,的文件。在這里,test.txt文件中已存入字符串文件中已存入字符串This is a test for testing the function of fsetpos.n將將pos設(shè)置為設(shè)置為10。應(yīng)用。應(yīng)用fsetpos函數(shù)將文件指針函數(shù)將文件指針fp按照按照pos指指定的位置在文件中定位。這樣文件指針定的位置在文件中定位。這樣文件指針fp指向字符串中指向字符串中test的字母的字母t。n再從新定位的文件指針開始讀取再從新定位的文件指針開始讀取16個字符到個字符到buffer緩沖區(qū),緩沖區(qū),也就是說讀取字符串也就是說讀取字符串test for testing到緩沖區(qū)到緩
25、沖區(qū)buffer。n最后顯示結(jié)果:最后顯示結(jié)果:16 bytes at byte 10: test for testing C語言庫函數(shù)-定位n int fseek(FILE *stream, long offset, int whence);stream為文件指針為文件指針offset為偏移量,整數(shù)表示正向偏移,負數(shù)為負向偏移為偏移量,整數(shù)表示正向偏移,負數(shù)為負向偏移whence設(shè)定從文件的哪里開始偏移,可能取值為:設(shè)定從文件的哪里開始偏移,可能取值為:SEEK_SET: 文件開頭文件開頭 0SEEK_CUR: 當前位置當前位置 1SEEK_END: 文件結(jié)尾文件結(jié)尾 2fseek(fp,1
26、00L,0);把把fp指針移動到離文件開頭指針移動到離文件開頭100字節(jié)處;字節(jié)處;fseek(fp,100L,1);把把fp指針移動到離文件當前位置指針移動到離文件當前位置100字節(jié)處;字節(jié)處;fseek(fp,100L,2);把把fp指針退回到離文件結(jié)尾指針退回到離文件結(jié)尾100字節(jié)處。字節(jié)處。C語言庫函數(shù)-關(guān)閉n 關(guān)閉:關(guān)閉:利用利用C庫函數(shù)關(guān)閉文件的操作:庫函數(shù)關(guān)閉文件的操作: int fclose (FILE *stream);目錄操作n新建目錄操作可使用函數(shù)mkdir()實現(xiàn),該函數(shù)的一般形式是:nmkdir(路徑, umask)n當目錄被成功創(chuàng)建函數(shù)的返回值為0,否則為1。n獲得當前工作目錄的操作可使用函數(shù)getcwd(),該函數(shù)的一般形式是:ngetcwd(char *buf, size_t size);n其中,*buf是存放當前目錄的緩沖區(qū),size是緩沖區(qū)的大小。如果函數(shù)返回當前目錄的字符串長度超過size規(guī)定的大小,它將返回NULL。目錄操作n 執(zhí)行程序的工作目錄就是當前子目錄,如果要改變執(zhí)行程序的工作目錄,可以使用函數(shù)chdir()。這個函數(shù)的作用如同shell里的cd命令一樣
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預覽,若沒有圖紙預覽就沒有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負責。
- 6. 下載文件中如有侵權(quán)或不適當內(nèi)容,請與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 六年級下冊數(shù)學教案-3.2 《正比例》 ︳西師大版
- 農(nóng)產(chǎn)品種栽培示范基地項目的實施方案編制合同(2025年版)
- (高清版)DB45∕T 1189-2024 城市交通地理信息數(shù)據(jù)組織及數(shù)據(jù)庫命名規(guī)則
- 學習2025年雷鋒精神62周年主題活動方案
- 第五單元習作例文:《我家的小狗》教學設(shè)計-2024-2025學年三年級上冊語文統(tǒng)編版
- 4-千克、克、噸-北師大版三年級下冊數(shù)學單元測試卷(含答案)
- 《南安軍》歷年中考古詩欣賞試題匯編(截至2022年)
- 2024年電磁功能材料精密加工輔助材料項目資金申請報告代可行性研究報告
- 2025年廣東省潮州市單招職業(yè)傾向性測試題庫及參考答案
- 地理-云南省師范大學附屬中學2025屆高三下學期開學考試試題和答案
- 全國第三屆職業(yè)技能大賽(智能網(wǎng)聯(lián)汽車裝調(diào)運維)選拔賽理論考試題庫(含答案)
- 電信網(wǎng)絡(luò)詐騙犯罪的特征、治理困境及對策建議
- 救護車掛靠私立醫(yī)院協(xié)議書(2篇)
- 《血透患教》課件
- app 購買合同范例
- 高二上學期物理(理科)期末試題(含答案)
- 2024年房地產(chǎn)經(jīng)紀人《房地產(chǎn)經(jīng)紀專業(yè)基礎(chǔ)》考前沖刺必會試題庫300題(含詳解)
- 礦山生態(tài)修復工程不穩(wěn)定斜坡治理工程設(shè)計
- 躲避球運動用球項目評價分析報告
- 風機盤管更換施工方案
- 河道整治與生態(tài)修復工程監(jiān)理規(guī)劃
評論
0/150
提交評論