Linux 文件和目录操作函数

更新时间:2023-07-22 16:17:01 阅读量: 实用文档 文档下载

说明:文章内容仅供预览,部分内容可能不全。下载后的文档,内容与下面显示的完全一致。下载之前请确认下面内容是否您想要的,是否完整无缺。

完整包含linux下文件和目录的各种操作和注意事项,是此类开发的必备手册!

Linux

文件和目录操作函

完整包含linux下文件和目录的各种操作和注意事项,是此类开发的必备手册!

文档更新记录

完整包含linux下文件和目录的各种操作和注意事项,是此类开发的必备手册!

只供内部使用

目 录

2

引言 ........................................................................................................................................... 4 2.1 2.2 2.3 2.4 3

编写目的 ......................................................................................................................... 4 预期读者和阅读建议 ..................................................................................................... 4 参考资料 ......................................................................................................................... 4 缩写术语 ......................................................................................................................... 4

底层文件操作 ........................................................................................................................... 5 3.1 3.2 3.3

概述 ................................................................................................................................. 5 所需头文件 ..................................................................................................................... 5 函数列表 ......................................................................................................................... 5 3.3.1 creat ....................................................................................................................... 5 3.3.2 open ....................................................................................................................... 5 3.3.3 close ...................................................................................................................... 7 3.3.4 read ........................................................................................................................ 7 3.3.5 write ...................................................................................................................... 8 3.3.6 lseek ...................................................................................................................... 8 3.3.7 access .................................................................................................................... 9 3.3.8 link ...................................................................................................................... 10 3.3.9 unlink .................................................................................................................. 10 3.3.10 fcntl ................................................................................................................... 10 3.3.11 stat ..................................................................................................................... 12 3.4 综合示例 ....................................................................................................................... 12

4 5

带缓冲区的文件操作 ............................................................................................................. 12 目录操作 ................................................................................................................................. 12

完整包含linux下文件和目录的各种操作和注意事项,是此类开发的必备手册!

1 引言

1.1

编写目的

文档中包含文件的底层操作、带缓冲区的操作、以及目录的相关操作。 1.2

1.3

参考资料

【1】 /zheng_he_xiang/blog/static/18650532620116311028365/ 【2】 1.4 缩写术语

预期读者和阅读建议

完整包含linux下文件和目录的各种操作和注意事项,是此类开发的必备手册!

2 底层文件操作

2.1

概述

底层文件操作,适合所有普通的文件。本操作集合以文件描述符为中心,描述普通文件的各种操作方法。 2.2

所需头文件

所需头文件列表如下:

#include <sys/types.h> #include <sys/stat.h> #include <fcntl.h> #include <unistd.h> 2.3

函数列表

2.3.1 creat 2.3.1.1 函数原型

函数原型如下:

int creat(const char *pathname, mode_t mode);

2.3.1.2 功能介绍

按照指定名称和权限,创建对应的文件。 2.3.1.3 参数介绍

pathname

表示要打开的文件名(包含路径名称,缺省是认为在当前路径下面)。 mode

指定新建文件的存取权限,它同umask一起决定文件的最终权限(mode&umask),其中umask代表了文件在创建时需要去掉的一些存取权限。umask可通过系统调用umask()来改变:

int umask(int newmask);

关于更详细的介绍,请参考open()函数对应内容。

2.3.1.4 返回值

成功:返回一个文件描述符。

失败:返回-1, 错误由errno指示。错误信息可通过strerror(errno)进行查看。 2.3.1.5 注意事项 2.3.1.6 使用示例

2.3.2 open 2.3.2.1 函数原型

函数原型如下:

int open(const char *pathname, int flags);

完整包含linux下文件和目录的各种操作和注意事项,是此类开发的必备手册!

int open(const char *pathname, int flags, mode_t mode); open()函数为变参函数。

2.3.2.2 功能介绍

按照指定名称和权限,打开或创建对应的文件。 2.3.2.3 参数介绍

pathname

表示要打开的文件名(包含路径名称,缺省是认为在当前路径下面)。 flags

表示打开文件的方式。

mode

mode只有在创建文件时有效,用于指定文件的访问权限。

完整包含linux下文件和目录的各种操作和注意事项,是此类开发的必备手册!

除了可以通过上述宏进行“或”逻辑产生标志以外,我们也可以自己用数字来表示,Linux总共用5个数字来表示文件的各种权限:第一位表示设置用户ID;第二位表示设置组ID;第三位表示用户自己的权限位;第四位表示组的权限;最后一位表示其他人的权限。每个数字可以取1(执行权限)、2(写权限)、4(读权限)、0(无)或者是这些值的和。例如,要创建一个用户可读、可写、可执行,但是组没有权限,其他人可以读、可以执行的文件,并设置用户ID位。那么,我们应该使用的模式是1(设置用户ID)、0(不设置组ID)、7(1+2+4,读、写、执行)、0(没有权限)、5(1+4,读、执行)即10705:

open("test", O_CREAT, 10705);

以上语句相当于:

open("test", O_CREAT, S_IRWXU | S_IROTH | S_IXOTH | S_ISUID );

2.3.2.4 返回值

成功:返回一个文件描述符。

失败:返回-1, 错误由errno指示。错误信息可通过strerror(errno)进行查看。 2.3.2.5 注意事项 2.3.2.6 使用示例

2.3.3 close

用于关闭由creat()或open()打开的文件。 2.3.4 read 2.3.4.1 函数原型

函数原型如下:

ssize_t read(int fd, void *buf, size_t count);

2.3.4.2 功能介绍

函数read()实现从文件描述符fd所指定的文件中读取length个字节到buf所指向的缓冲区中,返回值为实际读取的字节数。 2.3.4.3 参数介绍

fd

文件描述符,通过creat()或open()获取。 buf

指向缓冲区的指针。 count

缓冲区的长度,单位为字节。

2.3.4.4 返回值

成功:返回读取的字节数。

完整包含linux下文件和目录的各种操作和注意事项,是此类开发的必备手册!

失败:返回-1并设置errno。错误信息可通过strerror(errno)进行查看。 到达文件末尾:如果在调read之前已到达文件末尾,则这次read返回0。 2.3.4.5 注意事项 2.3.4.6 使用示例

2.3.5 write 2.3.5.1 函数原型

函数原型如下:

ssize_t write(int fd, const void *buf, size_t count);

2.3.5.2 功能介绍

函数write实现将把length个字节从buf指向的缓冲区中写到文件描述符fd所指向的文件中,返回值为实际写入的字节数。 2.3.5.3 参数介绍

fd

文件描述符,通过creat()或open()获取。 buf

指向缓冲区的指针。 count

缓冲区的长度,单位为字节。

2.3.5.4 返回值

成功:返回读取的字节数。

失败:返回-1并设置errno。错误信息可通过strerror(errno)进行查看。 2.3.5.5 注意事项 2.3.5.6 使用示例

2.3.6 lseek 2.3.6.1 函数原型

函数原型如下:

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

2.3.6.2 功能介绍

lseek()将文件读写指针相对whence移动offset个字节。操作成功时,返回文件指针相对于文件头的位置。 2.3.6.3 参数介绍

fd

文件描述符。 offset

表示偏移量。offset可取负值,例如下述调用可将文件指针相对当前位置向前移

完整包含linux下文件和目录的各种操作和注意事项,是此类开发的必备手册!

动5个字节:

lseek(fd, -5, SEEK_CUR);

whence

参数whence可使用下述值:

SEEK_SET:相对文件开头

SEEK_CUR:相对文件读写指针的当前位置 SEEK_END:相对文件末尾 2.3.6.4 返回值

成功:返回文件指针相对于文件头的位置,即二者距离,单位为字节。

失败:返回-1, 错误由errno指示。错误信息可通过strerror(errno)进行查看。 2.3.6.5 注意事项 2.3.6.6 使用示例

获取整个文件的长度:

由于lseek函数的返回值为文件指针相对于文件头的位置,因此下列调用的返回值就是文件的长度:

lseek(fd, 0, SEEK_END);

2.3.7 access 2.3.7.1 函数原型

函数原型如下:

int access(const char *pathname, int mode);

2.3.7.2 功能介绍

用于检查调用进程是否可以对指定的文件执行某种操作。 2.3.7.3 参数介绍

pathname

表示要打开的文件名(包含路径名称,缺省是认为在当前路径下面)。 mode

表示需要测试的操作模式。mode可以是如下值的组合体: R_OK: 可读 W_OK: 可写 X_OK: 可执行 F_OK: 文件存在 2.3.7.4 返回值

成功:返回0。

失败:返回-1, 错误由errno指示。错误信息可通过strerror(errno)进行查看。

errno被设为以下的某个值 EINVAL: 模式值无效

EACCES: 文件或路径名中包含的目录不可访问 ELOOP : 解释路径名过程中存在太多的符号连接 ENAMETOOLONG:路径名太长

ENOENT: 路径名中的目录不存在或是无效的符号连接

完整包含linux下文件和目录的各种操作和注意事项,是此类开发的必备手册!

ENOTDIR: 路径名中当作目录的组件并非目录 EROFS: 文件系统只读

EFAULT: 路径名指向可访问的空间外 EIO: 输入输出错误

ENOMEM: 不能获取足够的内核内存 ETXTBSY:对程序写入出错

2.3.7.5 注意事项 2.3.7.6 使用示例

2.3.8 link 2.3.9 unlink 2.3.10 fcntl 2.3.10.1 函数原型

函数原型如下:

int fcntl(int fd, int cmd);

int fcntl(int fd, int cmd, long arg);

int fcntl(int fd, int cmd, struct flock *lock); open()函数为变参函数。 2.3.10.2 功能介绍

fcntl()针对(文件)描述符提供控制。参数fd是被参数cmd操作(如下面的描述)的描述符。针对cmd的值,fcntl能够接受第三个参数int arg。

fcntl函数有5种功能:

1. 复制一个现有的描述符(cmd=F_DUPFD)

2. 获得/设置文件描述符标记(cmd=F_GETFD或F_SETFD) 3. 获得/设置文件状态标记(cmd=F_GETFL或F_SETFL)

4. 获得/设置异步I/O所有权(cmd=F_GETOWN或F_SETOWN) 5. 获得/设置记录锁(cmd=F_GETLK , F_SETLK或F_SETLKW) 2.3.10.2.1 复制描述符

最小的大于或等于arg的一个可用的描述; 与原始操作符一样的某对象的引用;

如果对象是文件(file)的话,则返回一个新的描述符,这个描述符与arg共享相

同的偏移量(offset);

相同的访问模式(读,写或读/写);

相同的文件状态标志(如:两个文件描述符共享相同的状态标志);

与新的文件描述符结合在一起的close-on-exec标志被设置成交叉式访问

execve(2)的系统调用。

实际上调用dup(oldfd); 等效于

fcntl(oldfd, F_DUPFD, 0); 而调用dup2(oldfd, newfd); 等效于

完整包含linux下文件和目录的各种操作和注意事项,是此类开发的必备手册!

close(oldfd);

fcntl(oldfd, F_DUPFD, newfd);

2.3.10.2.2 描述符标记操作

F_GETFD 取得与文件描述符fd联合的close-on-exec标志,类似FD_CLOEXEC。如果返回值和FD_CLOEXEC进行与运算结果是0的话,文件保持交叉式访问exec(),否则如果通过exec运行的话,文件将被关闭(arg 被忽略)

F_SETFD 设置close-on-exec标志,该标志以参数arg的FD_CLOEXEC位决定,应当了解很多现存的涉及文件描述符标志的程序并不使用常数 FD_CLOEXEC,而是将此标志设置为0(系统默认,在exec时不关闭)或1(在exec时关闭)

在修改文件描述符标志或文件状态标志时必须谨慎,先要取得现在的标志值,然后按照希望修改它,最后设置新标志值。不能只是执行F_SETFD或F_SETFL命令,这样会关闭以前设置的标志位。

2.3.10.2.3 文件状态标记操作

F_GETFL 取得fd的文件状态标志,如同下面的描述一样(arg被忽略),在说明open函数时,已说明了文件状态标志。不幸的是,三个存取方式标志 (O_RDONLY , O_WRONLY , 以及O_RDWR)并不各占1位。(这三种标志的值各是0 , 1和2,由于历史原因,这三种值互斥 — 一个文件只能有这三种值之一。) 因此首先必须用屏蔽字O_ACCMODE相与取得存取方式位,然后将结果与这三种值相比较。

F_SETFL 设置给arg描述符状态标志,可以更改的几个标志是:O_APPEND,O_NONBLOCK,O_SYNC 和 O_ASYNC。而fcntl的文件状态标志总共有7个:O_RDONLY , O_WRONLY , O_RDWR , O_APPEND , O_NONBLOCK , O_SYNC和O_ASYNC 可更改的几个标志如下面的描述:

O_NONBLOCK 非阻塞I/O,如果read(2)调用没有可读取的数据,或者如果write(2)操作将阻塞,则read或write调用将返回-1和EAGAIN错误

O_APPEND 强制每次写(write)操作都添加在文件大的末尾,相当于open(2)的O_APPEND标志

O_DIRECT 最小化或去掉reading和writing的缓存影响。系统将企图避免缓存你的读或写的数据。如果不能够避免缓存,那么它将最小化已经被缓存了的数据造成的影响。如果这个标志用的不够好,将大大的降低性能

O_ASYNC 当I/O可用的时候,允许SIGIO信号发送到进程组,例如:当有数据可以读的时候。

完整包含linux下文件和目录的各种操作和注意事项,是此类开发的必备手册!

2.3.10.2.4 异步I/O所有权操作

F_GETOWN 取得当前正在接收SIGIO或者SIGURG信号的进程id或进程组id,进程组id返回的是负值(arg被忽略) 。

F_SETOWN 设置将接收SIGIO和SIGURG信号的进程id或进程组id,进程组id通过提供负值的arg来说明(arg绝对值的一个进程组ID),否则arg将被认为是进程id。

2.3.10.2.5 记录锁操作

获得/设置记录锁的功能,成功则返回0,若有错误则返回-1,错误原因存于errno。

2.3.10.3 参数介绍

2.3.10.4 返回值

成功:返回一个文件描述符。

失败:返回-1, 错误由errno指示。错误信息可通过strerror(errno)进行查看。 2.3.10.5 注意事项 2.3.10.6 使用示例

2.3.11 stat 2.3.11.1 2.3.11.2 2.4

综合示例

3 带缓冲区的文件操作 4 目录操作 5 文件修改操作

方法:s

将文件按行读到内存,同时建立一个行的指针数组或链表。 删除行, 将指针清除。添加行,插入指针。

存盘时候,存到新文件,存成功了再改回原名。

评价:

上述操作比一次性读取文件所有内容的方式要更方便一些。

本文来源:https://www.bwwdw.com/article/nszm.html

Top