readdir文件备份实现方法
作者:技术拾光时间:2026-06-03 15:27:07浏览:484
利用readdir函数遍历源目录,配合stat判断文件类型,递归复制普通文件与子目录到目标路径,实现目录备份。代码通过open、read、write逐块复制文件内容,并自动创建目标目录结构。该方法基础但清晰,可扩展以支持符号链接等特殊需求。
说到文件操作,`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;
}
```
