文件操作5——目录和其他

文件操作5——目录和其他
最新回答
清风未央

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);

通过上述函数和系统调用,可以高效地完成目录遍历、文件属性管理、链接操作以及进程工作目录控制等任务。