利用readdir函数遍历源目录,配合stat判断文件类型,递归复制普通文件与子目录到目标路径,实现目录备份。代码通过open、read、write逐块复制文件内容,并自动创建目标目录结构。该方法基础但清晰,可扩展以支持符号链接等特殊需求。
readdir文件备份实现方法
作者:技术拾光
时间:2026-06-03
浏览:483
文章目录
说到文件操作,`readdir` 这个函数大家应该不陌生——它专门用来读取目录内容。那问题来了:能不能用它实现一个文件备份工具?答案是肯定的,而且思路很直接:遍历源目录下的所有文件和子目录,然后逐一复制到目标目录。下面这段代码就是一个简洁的参考实现,它展示了 `readdir` 配合 `stat`、`open` 等函数完成目录递归备份的基本套路。
#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;
}
```
readdir 文件备份代码实现
```c #include程序运行说明与核心逻辑
这个程序接受两个命令行参数:源目录和目标目录。运行时会先创建目标目录(如果不存在),然后递归遍历源目录中的所有内容。对每个普通文件调用 `backup_file` 逐块复制;遇到子目录则递归进入,并在目标路径下创建同名目录。代码结构清晰,核心逻辑都集中在 `backup_directory` 里,通过 `readdir` 读取目录项,再用 `stat` 判断文件类型来区分处理。适用场景与扩展方向
当然,这个版本比较基础——它不会处理符号链接、设备文件等特殊类型,也没有做错误恢复或增量备份。如果实际应用场景中有这些需求,还需要在此基础上做针对性扩展。但从理解 `readdir` 的用法和目录递归遍历的角度来说,它已经足够演示核心思路了。实用工具推荐
电子包浆
使用 ›绿化、压缩、噪点和虚拟水印,自由调节做旧程度。
图片压缩
使用 ›选择画质和输出格式,预览压缩前后的大小。
相关文章