站长论坛

标题: 文件操作——利用Linux系统调用 [打印本页]

作者: lutr    时间: 2010-7-23 10:11
标题: 文件操作——利用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

  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[i]);

  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 }
作者: lutr    时间: 2010-7-23 10:12
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 }




欢迎光临 站长论坛 (http://tzlink.com/bbs/) Powered by Discuz! X3.2