首页 > 代码库 > Linux文件操作

Linux文件操作

  在实际开发的过程中,时常会用到文件,比如打印的log,记录数据的文本,程序调试的debug信息等,所以linux下文件操作是作为一个linux开发者必备的技能之一。

1.创建

  任何事物都需要经历一个从无到有的过程,linux下的文件有不例外,linux下创建文件有很多种方式,下面就来一一列举

  (1).在shell中用命令创建

   比如:touch hello.txt  //创建一个名为hello.txt的空白文件

  (2).在程序中使用代码创建

    a. int creat(const char *filename, mode_t mode)    //filename需要指定具体的路径,mode指定的是文件的权限

  如果需要查看详细的说明,可以在linux中使用命令man creat

    例如: create("./hello.txt", S_IXUSR);    //在当前路径下创建hello.txt的文件,并且用户对该文件具有读/写/执行权限

函数返回文件描述符,如果返回-1则表示错误发生  

技术分享

  b.int open(const char *pathname, int flag, mode_t mode)

    flag需要设置为O_CREAT,表示如果文件不存在则创建文件,mode和creat函数中的mode是相同的,表示的是文件的权限属性;需要注意的是,如果添加了O_CREAT参数,如果文件已经存在,函数会返回错误

2.打开文件

  int open(const char *pathname, int flags);    //操作已经存在的文件

  int open(const char *pathname, int flags, mode_t mode);   //操作未存在的文件,mode主要是对文件权限进行设置

在linux中man open 的时候可能查不到open函数的介绍,因为这是man手册把它和creat放在一起了,直接man creat就行了,如下图所示,上面是使用这个函数需要添加的头文件 

技术分享

open函数会返回一个文件描述符,在程序中调用read/write的时候需要用到这个文件描述符,其实就是告诉了程序一种找到文件的方式 

技术分享

3.关闭文件

  关闭文件很简单,直接调用close()函数就行了,参数是open函数返回的文件描述符

4.读取文件内容

  int read(int fd, const void *buf, size_t length);   //从当前光标开始的位置读取数据,如果不设置光标位置,那么就是默认从头开始读length个字节

5.向文件写信息

   int write(int fd, const void *buf, size_t length);  //从光标开始的位置写数据,默认是从头开始写

6.调整文件光标的位置

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

lseek函数可以将光标相对当前位置就行位移,whence参数可以指定当前位置(SEEK_SET: 文件开头  SEEK_CUR:文件当前光标位置  SEEK_END:文件末尾),不同的参数对offset有不同的使用

 OFFSET_SET: 

  The offset is set to offset bytes.   //相对于文件头的偏移

 OFFSET_CUR:

  The offset is set to it‘s current location plus offset.   //相对当前位置的偏移,负数为往前,正数为往后

 OFFSET_END:

  The offset is set to the size of the file plus offset bytes.   //文件大小加上offset数值

函数执行成功返回相对文件头的偏移,失败则返回-1,见man手册

技术分享

 下面是一个简单的小例子:

技术分享
 1 #include <stdio.h>
 2 #include <sys/types.h>
 3 #include <fcntl.h>
 4 #include <sys/stat.h>
 5 #include <string.h>
 6 
 7 #define LENGTH  100
 8 
 9 int main()
10 {
11     int fd, len;
12     char str[LENGTH];
13     char *tmp = "hello world";
14 
15     fd = open("./hello.txt", O_CREAT | O_RDWR | S_IRUSR | S_IWUSR, S_IRWXG);
16     if (fd < 0)
17     {
18         printf("Open failed. \n");
19         return -1;
20     }
21     else
22     {
23         write(fd, tmp, strlen(tmp));
24     }
25     lseek(fd, SEEK_SET, sizeof(tmp)); 
26     write(fd, tmp, strlen(tmp));
27     close(fd);
28     return 0;
29 }
View Code

 

Linux文件操作