熱烈祝賀臺州維博網絡的站長論壇隆重上線!(2012-05-28)    熱烈慶祝偉大的祖國60周年生日 點擊進來我們一起為她祝福吧(2009-09-26)    站長論壇禁止發布廣告,一經發現立即刪除。謝謝各位合作!.(2009-08-08)    熱烈祝賀臺州網址導航全面升級,全新版本上線!希望各位一如既往地支持臺州網址導航的發展.(2009-03-28)    臺州站長論壇恭祝各位新年快樂,牛年行大運!(2009-01-24)    臺州Link正式更名為臺州網址導航,專業做以臺州網址為主的網址導航!(2008-05-23)    熱烈祝賀臺州Link資訊改名為中國站長資訊!希望在以后日子里得到大家的大力支持和幫助!(2008-04-10)    熱烈祝賀臺州Link論壇改名為臺州站長論壇!希望大家繼續支持和鼓勵!(2008-04-10)    臺州站長論壇原[社會瑣碎]版塊更名為[生活百科]版塊!(2007-09-05)    特此通知:新臺州站長論壇的數據信息全部升級成功!">特此通知:新臺州站長論壇的數據信息全部升級成功!(2007-09-01)    臺州站長論壇對未通過驗證的會員進行合理的清除,請您諒解(2007-08-30)    臺州網址導航|上網導航誠邀世界各地的網站友情鏈接和友誼聯盟,共同引領網站導航、前進!(2007-08-30)    禁止發廣告之類的帖,已發現立即刪除!(2007-08-30)    希望各位上傳與下載有用資源和最新信息(2007-08-30)    熱烈祝賀臺州站長論壇全面升級成功,全新上線!(2007-08-30)    
便民網址導航,輕松網上沖浪。
臺州維博網絡專業開發網站門戶平臺系統
您當前的位置: 首頁 » Linux編程開發 » 文件操作——利用Linux系統調用

文件操作——利用Linux系統調用

論壇鏈接
  • 文件操作——利用Linux系統調用
  • 發布時間:2010-07-23 10:11:48    瀏覽數:6255    發布者:lutr    設置字體【   
1.創建文件

  int creat(const char *filename, mode_t mode)

  filename:要創建的文件名(包含路徑,缺省為當前路徑)

  mode:創建的文件的模式/訪問權限

  常見模式:

  S_IRUSR 可讀

  S_IWUSR 可寫

  S_IXUSR 可執行

  S_IRWXU 可讀、可寫、可執行

  還可以直接使用數字來表示文件的訪問權限:

  可執行 1

  可寫 2

  可讀 4

  上述三個值的和,如可讀可寫可執行 7(1+2+4)

  無任何權限 0

  1 #include <stdio.h>

  2 #include <stdlib.h>

  3

  4 #include <sys/types.h>

  5 #include <sys/stat.h>

  6 #include <fcntl.h>

  7

  8 void create_file(char *filename){

  9

  10 /*創建的文件的屬性0755表示:

  11 文件所有者可讀可寫可執行;

  12 文件所有者所在組用戶可讀可執行;

  13 其他用戶可讀可執行*/

  14 if(creat(filename,0755)<0){

  15 printf("create file %s failure!\n",filename);

  16 exit(EXIT_FAILURE);

  17 }else{

  18 printf("create file %s success!\n",filename);

  19 }

  20 }

  21

  22 int main(int argc,char *argv[]){

  23 int i;

  24 if(argc<2){

  25 perror("you haven't input the filename,please try again!\n");

  26 exit(EXIT_FAILURE);

  27 }

  28

  29 for(i=1;i<argc;i++){

  30 create_file(argv);

  31 }

  32

  33 exit(EXIT_SUCCESS);

  34 }

  35

  2.打開文件

  int open(const char *pathname, int flags)

  int open(const char *pathname, int flags, mode_t mode)

  常見打開標志(flags):

  O_RDONLY 只讀方式打開

  O_WRONLY 只寫方式打開

  O_RDWR 讀寫方式打開

  O_APPEND 追加方式打開

  O_CREATE 創建一個文件

  O_NOBLOCK 非阻塞方式打開

  如果使用了O_CREATE標志,則必須指定mode來表示文件的訪問權限。

  1 #include <stdio.h>

  2 #include <stdlib.h>

  3

  4 #include <sys/types.h>

  5 #include <sys/stat.h>

  6 #include <fcntl.h>

  7

  8 int main(int argc ,char *argv[]){

  9 int fd;

  10 if(argc<2){

  11 puts("please input the open file pathname!\n");

  12 exit(1);

  13 }

  14

  15 //如果flag參數里有O_CREAT表示,該文件如果不存在,系統則會創建該文件,該文件的權限由第三個參數決定,此處為0755

  16 //如果flah參數里沒有O_CREAT參數,則第三個參數不起作用.此時,如果要打開的文件不存在,則會報錯.

  17 //所以fd=open(argv[1],O_RDWR),僅僅只是打開指定文件

  18 if((fd=open(argv[1],O_CREAT|O_RDWR,0755))<0){

  19 perror("open file failure!\n");

  20 exit(1);

  21 }else{

  22 printf("open file %d success!\n",fd);

  23

  24 }

  25 close(fd);

  26 exit(0);

  27

  28 }
      3.關閉文件

  int close(int fd)

  fd:文件描述符(一個非負整數)

  4.讀文件

  int read(int fd, const void *buf, size_t length)

  從文件描述符fd所指向的文件中讀取length個字節到buf所指向的緩沖區中,返回實際讀取的字節數。

  5.寫文件

  int write(int fd, const void *buf, size_t length)

  把buf所指向的緩沖區中的length個字節寫到文件描述符fd所指向的文件中,返回實際寫入的字節數。

  6.定位文件(移動文件指針)

  int lseek(int fd, offset_t offset, int whence)

  將文件讀寫指針相對whence移動offset個字節。操作成功,則返回文件指針相對于文件頭的位置。

  whence可以取下述值:

  SEEK_SET:相對文件開頭

  SEEK_CUR:相對文件讀寫指針的當前位置

  SEEK_END:相對文件末尾

  offset可取負值,表示向前移動。

  7.訪問權限判斷

  int access(const char *pathname, int mode)

  pathname:文件名稱

  mode:要判斷的訪問權限,可以取下面的值或者它們的組合。R_OK:文件可讀,W_OK:文件可寫,X_OK:文件可執行,F_OK:文件存在。

  返回值:當我們測試成功時,函數返回0,否則如果有一個條件不符合,返回-1。

  1 #include <sys/types.h>

  2 #include <sys/stat.h>

  3 #include <fcntl.h>

  4 #include <stdio.h>

  5 #include <errno.h>

  6

  7 #define BUFFER_SIZE 1024

  8

  9 int main(int argc,char **argv)

  10 {

  11 int from_fd,to_fd;

  12 int bytes_read,bytes_write;

  13 char buffer[BUFFER_SIZE];

  14 char *ptr;

  15

  16 if(argc!=3)

  17 {

  18 fprintf(stderr,"Usage:%s fromfile tofile/n/a",argv[0]);

  19 exit(1);

  20 }

  21

  22 /* 打開源文件 */

  23 if((from_fd=open(argv[1],O_RDONLY))==-1)

  24 {

  25 fprintf(stderr,"Open %s Error:%s/n",argv[1],strerror(errno));

  26 exit(1);

  27 }

  28

  29 /* 創建目的文件 */

  30 if((to_fd=open(argv[2],O_WRONLY|O_CREAT,S_IRUSR|S_IWUSR))==-1)

  31 {

  32 fprintf(stderr,"Open %s Error:%s/n",argv[2],strerror(errno));

  33 exit(1);

  34 }

  35

  36 /* 以下代碼是一個經典的拷貝文件的代碼 */

  37 while(bytes_read=read(from_fd,buffer,BUFFER_SIZE))

  38 {

  39 /* 一個致命的錯誤發生了 */

  40 if((bytes_read==-1)&&(errno!=EINTR)) break;

  41 else if(bytes_read>0)

  42 {

  43 ptr=buffer;

  44 while(bytes_write=write(to_fd,ptr,bytes_read))

  45 {

  46 /* 一個致命錯誤發生了 */

  47 if((bytes_write==-1)&&(errno!=EINTR))break;

  48 /* 寫完了所有讀的字節 */

  49 else if(bytes_write==bytes_read) break;

  50 /* 只寫了一部分,繼續寫 */

  51 else if(bytes_write>0)

  52 {

  53 ptr+=bytes_write;

  54 bytes_read-=bytes_write;

  55 }

  56 }

  57 /* 寫的時候發生的致命錯誤 */

  58 if(bytes_write==-1)break;

  59 }

  60 }

  61 close(from_fd);

  62 close(to_fd);

  63 exit(0);

  64 }
娛樂休閑專區A 影視預告B 音樂咖啡C 英語階梯D 生活百科
網頁編程專區E AMPZF HTMLG CSSH JSI ASPJ PHPK JSPL MySQLM AJAX
Linux技術區 N 系統管理O 服務器架設P 網絡/硬件Q 編程序開發R 內核/嵌入
管理中心專區S 發布網址T 版主議事U 事務處理
陕西快乐10分玩法 河北11选5走势图 浙江11选五预测专家 平台网站 北京pk拾历史开奖记录 加拿大快乐8算法 黑色偏门论坛 哪个etf更能代表上证指数 30选5 最好的股票分析软件排行榜 浙江20选5走势图超长版