lutr 发表于 2010-7-23 10:11:48

文件操作——利用Linux系统调用

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

  8voidcreate_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,O_RDWR),仅仅只是打开指定文件

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

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

  20         exit(1);

  21   }else{

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

  23

  24   }

  25   close(fd);

  26   exit(0);

  27

  28 }

lutr 发表于 2010-7-23 10:12:01

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;

  14   char *ptr;

  15

  16   if(argc!=3)

  17   {

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

  19   exit(1);

  20   }

  21

  22   /* 打开源文件 */

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

  24   {

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

  26   exit(1);

  27   }

  28

  29   /* 创建目的文件 */

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

  31   {

  32   fprintf(stderr,"Open %s Error:%s/n",argv,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 }
页: [1]
查看完整版本: 文件操作——利用Linux系统调用

网站推广