• Linux系统下文件的通用操作方法


          每一个系统下都有对文件操作的应用,但是都大致相同,同样在Linux系统中也同样拥有对文件的操作。如:文件描述符、open()函数、close()函数、read()函数、write()函数、文件偏移lseek()函数、获取文件状态fstat()函数、文件空间映射mmap()函数、取消mmap()映射的munmap()函数、文件属性fcntl()函数和文件输入输出控制ioctl()函数。此处主要说open()函数、close()函数、read()函数、write()函数

          一、文件描述符

         文件描述符是一个整形的数据,所有对文件的操作都通过文件描述符实现。在Linux系统中用文件描述符表示设备文件和普通文件。文件描述符是文件系统中连接用户空间和内核空间的枢纽。而文件描述符的范围为0~OPEN_MAX,它是一个有限的资源,在使用完毕后需要及时释放。

         在Linux系统中有3个已经分配的文件描述符,即标准输入、标准输出和标准错误,它们的文件描述符的值分别为0、1和2.

         二、打开创建文件open()、create()函数

         open()函数的原型:

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

         对于open()函数,在使用时需要包含头文件sys/types.h、sys/stat.h、fcntl.h。通常在用户通过open()函数打开pathname指定的文件后,该函数会返回一个值,如果打开成功,返回一个整形的文件描述符。再出错时会返回-1。对于pathname所指的是一个字符串变量,该字符串变量的长度一般为1024个字节。对于超过这个大小以后,系统会自动截断,选择最前面的字节操作。

         对于flags变量是文件标志变量,用于判定文件的打开方式,其中文件的打开方式可以为只读、只写或读写方式打开,分别用O_RDONLY、O_WRONLY、O_RDWR表示,并且在打开文件的方式时必须使用这三种方式中的其一。在这三个参数中O_RDONLY通常定义为0、O_WRONLY定义为1、O_RDWR定义为2。

         除这上述的三种打开方式外还有其他的一些参数。

            如:O_APPEND:使每次对文件进行写操作都追加到文件的尾端。

          O_CREAT:如果文件不存在则创建文件

          O_EXCL :查看文件是否存在,如果存在则返回-1

          O_TRUNC:将文件的长度截断为0.如果此文件存在,并且文件成功打开,则会将其长度截断为0。

          O_NONBLOCK:以非阻塞方式打开文件,默认的是阻塞方式。

     1 #include<sys/types.h>
     2 #include<sys/stat.h>
     3 #include<fcntl.h>
     4 #include<stdio.h>
     5 int main(void)
     6 {
     7    int fd = -1;
     8    char filename[]="test.txt";
     9    fd = open(filename,O_RDWR);
    10    if(fd == -1) 
    11       printf("文件打开失败!,fd:%d\n",fd);
    12    else 
    13       printf("文件 %s 打开成功!,fd:%d\n",filename,fd);
    14 return 0;
    15 }

      二、关闭文件close()函数

      close()函数关闭一个打开的文件,之前打开文件所占用的资源。

      close()函数的原型:

    1 #include<unistd.h>
    2 int close(int fd);

      close()函数关闭的是一个文件描述符,关闭以后此文件描述符不再指向任何文件,从而文件描述符可以再次使用。当函数执行成功时返回0,执行错误时返回-1.

      close()函数的例子:

     1 #include<sys/types.h>
     2 #inlcude<sys/stat.h>
     3 #include<fcntl.h>
     4 #include<unistd.h>
     5 #include<stdio.h>
     6 int mian(void)
     7 {
     8    int fd=0;
     9    fd=open("test.txt",O_RDONLY);
    10    if(fd >0) 
    11       printf("文件打开成功!,fd:%d\n",fd);
    12    else 
    13    {
    14       printf("文件打开失败!\n");
    15       exit(0);  
    16    }
    17 close(fd);
    18 return 0;
    19 }

      三、读取文件read()函数

      read()函数从打开文件中读取数据,用户可以对读入的数据进行操作。

      read()函数的原型:

    1 #include<unistd.h>
    2 ssize_t read(int fd,void *buf,size_t count);

      read()函数从文件描述符fd对应的文件中读取count字节,放到buf开始的缓存区中,如果count为0,read()函数返回0;如果count大于SSIZE_MAX,结果不可预料。当read()函数的返回结果为-1时,说明读取函数有错误,在达到文件末尾时,返回0。

      在使用read()函数时,count请求的字节数量,read()函数不一定能够读取这么多数据,在很多中情况下可以使实际上读取的字节数小于请求读取的字节数。

         如:

        (1)、读取普通文件时,文件中剩余的字节数不够请求的字节数。

        (2)、当从中断设备数据的时候,其默认长度不够read()函数请求读取的字节数。

        (3)、当从网络读取数据时,缓存区大小有可能小于读取请求的数据大小。

      read()函数的例子:

     1 #include<sys/types.h>
     2 #include<sys/stat.h>
     3 #include<fcntl.h>
     4 #include<unistd.h>
     5 #include<stdio.h>
     6 int main(void )
     7 {
     8    int fd = -1,i;
     9    ssize_t size = -1;
    10    char buf[10];
    11    char filenema[]="test.txt";
    12    
    13    fd = open(filename,O_RDONLY);
    14    if(fd == -1)
    15       printf("文件 %s 打开失败!,fd: %d\n",filename,fd);
    16    else
    17       printf("文件 %s 打开成功!,fd: %d\n",filename,fd);
    18    while(size){
    19       size =read(fd,buf,0);
    20       if(size == -1)
    21       {
    22          close(fd);printf("文件读取失败!\n");
    23       }  else{
    24          if(size > 0){
    25             printf("read %ld bytes:",size);
    26             for(i = 0;i<size;i++) printf("%c",*(buf+i));
    27             printf("\n");  
    28          }else printf("到达文件末尾\n");
    29       }
    30    }
    31 close(size);
    32 return 0;
    33 }

      四、写文件write()函数

      write()函数向打开的文件中写入数据,将用户的数据保存到文件中。与read()函数的含义相似,write()函数向文件描述符fd写入数据,数据的大小由count指定,buf为要写如数据的指针,write()函数返回值为成功写入数据的字节数。当文件写入失败时,该函数会返回-1。

      write()函数的原型:

    1 #include<unistd.h>
    2 ssize_t write(int fd,const void *buf,size_t count);

      write()函数例子:

     1 #include<sys/types.h>
     2 #include<sys/stat.h>
     3 #include<fcntl.h>
     4 #include<string.h>
     5 #include<stdio.h>
     6 #include<unistd.h>
     7 int main(void)
     8 {
     9    int fd = -1;
    10    ssize_t size = -1;
    11    char buf[]="quick brown fox jump over the lazy dog";
    12    char filename[]="test.txt";
    13 
    14    fd = open(filename,O_RDWR);
    15    if(-1==fd)
    16       printf("文件 %s 打开失败,fd:%d\n",filename,fd);
    17    else 
    18       printf("文件 %s 打开成功,fd:%d\n",filename,fd);
    19    size = write(fd,buf,strlen(buf));
    20    printf("写入%ld个字节到文件 %s 中\n",size,filename);
    21 close(fd);
    22 return 0;
    23 }

     

  • 相关阅读:
    final
    职场语句
    故事
    三个关键字
    关于重读字母去掉的代码
    Java书
    docker私库harbor的搭建
    配置允许匿名用户登录访问vsftpd服务,进行文档的上传下载、文档的新建删除等操作
    docker容器内外相互拷贝数据
    docker
  • 原文地址:https://www.cnblogs.com/zhy128/p/6126711.html
Copyright © 2020-2023  润新知