要求在 Linux 中遍历一个目录,并将该目录所有文件拷贝到另外一个目录中,要求“复制”时使用系统函数,“粘贴”时使用标准库函数,即read函数和fwrite函数。并对比这两种方式的区别,说说你更愿意使用哪种方式?觉得哪种好?
时间: 2024-03-17 10:47:51 浏览: 63
在 中遍历一个目录并将该目录所有文件拷贝到另一个目录中,可以使用系统函数 opendir、readdir 和 closedir 来扫描目录,再使用系统函数 open、read 和 write 来复制文件。代码如下:
```c
#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>
#include <dirent.h>
#define BUF_SIZE 1024
void copy_file_sys(char *src, char *dst) {
char buf[BUF_SIZE];
int src_fd, dst_fd, n;
src_fd = open(src, O_RDONLY);
if (src_fd == -1) {
perror("open");
exit(EXIT_FAILURE);
}
dst_fd = open(dst, O_WRONLY|O_CREAT|O_TRUNC, 0644);
if (dst_fd == -1) {
perror("open");
exit(EXIT_FAILURE);
}
while ((n = read(src_fd, buf, BUF_SIZE)) > 0) {
if (write(dst_fd, buf, n) != n) {
perror("write");
exit(EXIT_FAILURE);
}
}
if (n == -1) {
perror("read");
exit(EXIT_FAILURE);
}
if (close(src_fd) == -1) {
perror("close");
exit(EXIT_FAILURE);
}
if (close(dst_fd) == -1) {
perror("close");
exit(EXIT_FAILURE);
}
}
void copy_file_std(FILE *src, FILE *dst) {
char buf[BUF_SIZE];
size_t n;
while ((n = fread(buf, 1, BUF_SIZE, src)) > 0) {
if (fwrite(buf, 1, n, dst) != n) {
perror("fwrite");
exit(EXIT_FAILURE);
}
}
if (ferror(src)) {
perror("fread");
exit(EXIT_FAILURE);
}
if (fclose(src) != 0) {
perror("fclose");
exit(EXIT_FAILURE);
}
if (fclose(dst) != 0) {
perror("fclose");
exit(EXIT_FAILURE);
}
}
void copy_dir(char *src_dir, char *dst_dir) {
DIR *dir;
struct dirent *entry;
struct stat stat_buf;
char src_path[PATH_MAX], dst_path[PATH_MAX];
dir = opendir(src_dir);
if (dir == NULL) {
perror("opendir");
exit(EXIT_FAILURE);
}
while ((entry = readdir(dir)) != NULL) {
if (entry->d_name[0] == '.') {
continue;
}
snprintf(src_path, PATH_MAX, "%s/%s", src_dir, entry->d_name);
snprintf(dst_path, PATH_MAX, "%s/%s", dst_dir, entry->d_name);
if (lstat(src_path, &stat_buf) == -1) {
perror("lstat");
exit(EXIT_FAILURE);
}
if (S_ISREG(stat_buf.st_mode)) {
copy_file_sys(src_path, dst_path);
} else if (S_ISDIR(stat_buf.st_mode)) {
if (mkdir(dst_path, 0755) == -1) {
perror("mkdir");
exit(EXIT_FAILURE);
}
copy_dir(src_path, dst_path);
}
}
if (closedir(dir) == -1) {
perror("closedir");
exit(EXIT_FAILURE);
}
}
int main(int argc, char **argv) {
if (argc != 3) {
fprintf(stderr, "Usage: %s <src_dir> <dst_dir>\n", argv[0]);
exit(EXIT_FAILURE);
}
copy_dir(argv[1], argv[2]);
return 0;
}
```
其中,copy_file_sys 函数使用系统函数来复制文件,copy_file_std 函数使用标准库函数来复制文件,copy_dir 函数递归地复制目录。
使用系统函数来复制文件需要手动打开和关闭文件,读取和写入数据的操作也需要手动完成。而使用标准库函数则不需要手动打开和关闭文件,读取和写入数据的操作也只需要调用 fread 和 fwrite 函数即可。因此,使用标准库函数更加方便和简洁。
但是,使用标准库函数复制文件时,由于每次读取和写入数据的大小是固定的,因此可能会导致内存浪费或者文件复制速度变慢。而使用系统函数读取和写入数据时,可以根据实际情况动态地调整读取和写入的大小,从而更加高效。
综上所述,我更愿意使用标准库函数来复制文件,因为它更加方便和简洁,适用于大多数情况。但是,在特定的情况下,可能需要使用系统函数来读取和写入数据,以提高复制文件的效率。
阅读全文