首页 > 代码库 > 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 }
Linux文件操作