热烈祝贺台州朗动科技的站长论坛隆重上线!(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    浏览数:9973    发布者: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 事务处理