readdir文件备份实现方法

作者:技术拾光时间:2026-06-03 15:27:07浏览:484

利用readdir函数遍历源目录,配合stat判断文件类型,递归复制普通文件与子目录到目标路径,实现目录备份。代码通过open、read、write逐块复制文件内容,并自动创建目标目录结构。该方法基础但清晰,可扩展以支持符号链接等特殊需求。

说到文件操作,`readdir` 这个函数大家应该不陌生——它专门用来读取目录内容。那问题来了:能不能用它实现一个文件备份工具?答案是肯定的,而且思路很直接:遍历源目录下的所有文件和子目录,然后逐一复制到目标目录。下面这段代码就是一个简洁的参考实现,它展示了 `readdir` 配合 `stat`、`open` 等函数完成目录递归备份的基本套路。 readdir文件备份实现方法

readdir 文件备份代码实现

```c #include #include #include #include #include #include #include #include void backup_file(const char *src, const char *dst) { int src_fd = open(src, O_RDONLY); int dst_fd = open(dst, O_WRONLY | O_CREAT, S_IRUSR | S_IWUSR); if (src_fd == -1 || dst_fd == -1) { perror("open"); return; } char buffer[4096]; ssize_t bytes_read, bytes_written; while ((bytes_read = read(src_fd, buffer, sizeof(buffer))) > 0) { bytes_written = write(dst_fd, buffer, bytes_read); if (bytes_written != bytes_read) { perror("write"); break; } } close(src_fd); close(dst_fd); } void backup_directory(const char *src, const char *dst) { char src_path[1024], dst_path[1024]; struct dirent *entry; DIR *dp = opendir(src); if (!dp) { perror("opendir"); return; } while ((entry = readdir(dp)) != NULL) { if (strcmp(entry->d_name, ".") == 0 || strcmp(entry->d_name, "..") == 0) { continue; } snprintf(src_path, sizeof(src_path), "%s/%s", src, entry->d_name); snprintf(dst_path, sizeof(dst_path), "%s/%s", dst, entry->d_name); struct stat st; if (stat(src_path, &st) == -1) { perror("stat"); continue; } if (S_ISDIR(st.st_mode)) { mkdir(dst_path, st.st_mode); backup_directory(src_path, dst_path); } else { backup_file(src_path, dst_path); } } closedir(dp); } int main(int argc, char *argv[]) { if (argc != 3) { printf("Usage: %s \n", argv[0]); return 1; } const char *src = argv[1]; const char *dst = argv[2]; if (mkdir(dst, 0755) == -1 && errno != EEXIST) { perror("mkdir"); return 1; } backup_directory(src, dst); return 0; } ```

程序运行说明与核心逻辑

这个程序接受两个命令行参数:源目录和目标目录。运行时会先创建目标目录(如果不存在),然后递归遍历源目录中的所有内容。对每个普通文件调用 `backup_file` 逐块复制;遇到子目录则递归进入,并在目标路径下创建同名目录。代码结构清晰,核心逻辑都集中在 `backup_directory` 里,通过 `readdir` 读取目录项,再用 `stat` 判断文件类型来区分处理。

适用场景与扩展方向

当然,这个版本比较基础——它不会处理符号链接、设备文件等特殊类型,也没有做错误恢复或增量备份。如果实际应用场景中有这些需求,还需要在此基础上做针对性扩展。但从理解 `readdir` 的用法和目录递归遍历的角度来说,它已经足够演示核心思路了。