User 利用POSIX API(文件操作也可以使用ANSI C标准I/O库)编程实现cp –r命令,支持将源路径(目录)中的所有文件和子目录,以及子目录中的所有内容,全部拷贝到目标路径(目录)中。UNIX/Linux中在shell中输入命令名(可执行文件名)来启动程序,在命令名(可执行文件名)之后可以跟随一系列字符串(通过空格分割),这些字符串就是命令行参数 格式为:cp [参数] <源文件路径> <目标文件路径> cp /usr/local/src/main.c /root/main.c(文件到文件复制) cp /usr/local/src/main.c /root (文件到目录复制) cp –r /usr/local/src /root(递归复制,用于目录到目录的复制)
时间: 2023-08-16 11:08:39 浏览: 41
ChitGPT:
您好!关于您的问题,以下是实现cp –r命令的C代码:
```c
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <fcntl.h>
#include <unistd.h>
#include <sys/stat.h>
#include <sys/types.h>
#include <dirent.h>
void copy_file(char *src, char *dest) {
int src_fd, dest_fd;
ssize_t num_read;
char buf[BUFSIZ];
src_fd = open(src, O_RDONLY);
if (src_fd == -1) {
fprintf(stderr, "Failed to open %s\n", src);
exit(1);
}
dest_fd = creat(dest, S_IRUSR | S_IWUSR | S_IRGRP | S_IROTH);
if (dest_fd == -1) {
fprintf(stderr, "Failed to create %s\n", dest);
exit(1);
}
while ((num_read = read(src_fd, buf, BUFSIZ)) > 0) {
if (write(dest_fd, buf, num_read) != num_read) {
fprintf(stderr, "Failed to write to %s\n", dest);
exit(1);
}
}
if (num_read == -1) {
fprintf(stderr, "Failed to read from %s\n", src);
exit(1);
}
if (close(src_fd) == -1) {
fprintf(stderr, "Failed to close %s\n", src);
exit(1);
}
if (close(dest_fd) == -1) {
fprintf(stderr, "Failed to close %s\n", dest);
exit(1);
}
}
void copy_dir(char *src, char *dest) {
DIR *dp;
struct dirent *entry;
struct stat statbuf;
char src_path[PATH_MAX], dest_path[PATH_MAX];
dp = opendir(src);
if (dp == NULL) {
fprintf(stderr, "Failed to open directory %s\n", src);
exit(1);
}
if (mkdir(dest, S_IRWXU | S_IRWXG | S_IROTH | S_IXOTH) == -1) {
fprintf(stderr, "Failed to create directory %s\n", dest);
exit(1);
}
while ((entry = readdir(dp)) != NULL) {
if (strcmp(entry->d_name, ".") == 0 || strcmp(entry->d_name, "..") == 0) {
continue;
}
snprintf(src_path, PATH_MAX, "%s/%s", src, entry->d_name);
snprintf(dest_path, PATH_MAX, "%s/%s", dest, entry->d_name);
if (lstat(src_path, &statbuf) == -1) {
fprintf(stderr, "Failed to stat %s\n", src_path);
exit(1);
}
if (S_ISREG(statbuf.st_mode)) {
copy_file(src_path, dest_path);
} else if (S_ISDIR(statbuf.st_mode)) {
copy_dir(src_path, dest_path);
}
}
if (closedir(dp) == -1) {
fprintf(stderr, "Failed to close directory %s\n", src);
exit(1);
}
}
int main(int argc, char *argv[]) {
char *src_path, *dest_path;
if (argc != 3) {
fprintf(stderr, "Usage: %s <source> <destination>\n", argv[0]);
exit(1);
}
src_path = argv[1];
dest_path = argv[2];
struct stat statbuf;
if (lstat(src_path, &statbuf) == -1) {
fprintf(stderr, "Failed to stat %s\n", src_path);
exit(1);
}
if (S_ISREG(statbuf.st_mode)) {
copy_file(src_path, dest_path);
} else if (S_ISDIR(statbuf.st_mode)) {
copy_dir(src_path, dest_path);
}
return 0;
}
```
该代码实现了cp –r命令的递归复制功能,可以将源路径(目录)中的所有文件和子目录,以及子目录中的所有内容,全部拷贝到目标路径(目录)中。在命令行中,用户可以输入如下命令来执行该程序:
```
./cp –r /path/to/source /path/to/destination
```
其中,/path/to/source是源路径(目录),/path/to/destination是目标路径(目录)。