2026-10-31 13:55:12
文件操作中的目录操作和其他系统调用主要涉及目录访问、文件属性管理、链接操作、目录创建删除以及进程工作目录管理等内容。以下是对相关内容的详细阐述:
目录相关操作头文件与基本概念
目录操作函数声明在dirent.h头文件中,使用目录流(DIR指针)与真实目录建立联系,类似于FILE指针与文件的关联。
目录数据项存储在dirent结构体中,包含文件的inode节点号(ino_t d_ino)和文件名(char d_name)。
核心函数
opendir:打开目录并返回目录流指针,失败返回NULL。
#include <sys/types.h>#include <dirent.h>DIR *opendir(const char *name);readdir:读取目录流中的下一个目录项,返回dirent结构体指针。到达文件尾或出错时返回NULL。
struct dirent *readdir(DIR *dirp);telldir与seekdir:
telldir:获取目录流当前位置。
seekdir:根据telldir返回的位置重置目录扫描指针。
long int telldir(DIR *dirp);void seekdir(DIR *dirp, long int loc);closedir:关闭目录流并释放资源,成功返回0,失败返回-1。
int closedir(DIR *dirp);目录扫描实验
通过递归遍历目录,输出树形结构。示例代码中:
使用opendir打开目录,readdir读取目录项。
通过lstat获取文件属性,判断是否为目录(S_ISDIR)。
递归调用时,使用chdir切换工作目录,遍历完成后返回上级目录(chdir(".."))。
输出时通过depth参数控制缩进,目录名后添加/以区分文件。

文件流与文件描述符转换
fileno:将文件流(FILE*)转换为底层文件描述符(int)。
#include <stdio.h>int fileno(FILE *stream);fdopen:将文件描述符转换为文件流,并指定打开模式(如"r"、"w")。
FILE *fdopen(int fildes, const char *mode);文件与目录维护
chmod:修改文件访问权限,权限通过位或组合(如S_IRUSR | S_IWUSR)。
#include <sys/stat.h>int chmod(const char *path, mode_t mode);chown:修改文件属主和属组。
#include <sys/types.h>#include <unistd.h>int chown(const char *path, uid_t owner, gid_t group);unlink、link与symlink:
unlink:删除文件目录项,减少链接数。当链接数为0且无进程打开时,文件被删除。
link:创建硬链接,增加文件的链接数。
symlink:创建符号链接(软链接),不增加链接数。
#include <unistd.h>int unlink(const char *path);int link(const char *path1, const char *path2);int symlink(const char *path1, const char *path2);临时文件技巧:通过open创建文件后立即调用unlink,文件会在进程退出或关闭后自动删除。
目录创建与删除
mkdir:创建目录,需指定权限模式(如0755)。
rmdir:删除空目录。
#include <sys/types.h>#include <sys/stat.h>int mkdir(const char *path, mode_t mode);#include <unistd.h>int rmdir(const char *path);工作目录管理
chdir:改变进程工作目录(cd命令基础)。
getcwd:获取当前工作目录路径,结果存储在buf中。
#include <unistd.h>int chdir(const char *path);char *getcwd(char *buf, size_t size);fcntl:
用于操作文件描述符,如复制描述符(F_DUPFD)、设置非阻塞模式(O_NONBLOCK)或管理文件锁(F_SETLK)。
#include <fcntl.h>int fcntl(int fildes, int cmd, ...);mmap:
将文件映射到内存,实现共享内存或高效文件访问。映射区域可通过指针直接操作,修改会同步到文件。
#include <sys/mman.h>void *mmap(void *addr, size_t len, int prot, int flags, int fildes, off_t off);通过上述函数和系统调用,可以高效地完成目录遍历、文件属性管理、链接操作以及进程工作目录控制等任务。