linux

如何检查copendir是否成功

小樊
43
2025-06-09 21:01:14
栏目: 编程语言

在C语言中,copdir函数用于复制目录及其内容。然而,C标准库中并没有直接提供copdir函数。你可能是指opendirreaddir函数来遍历目录,以及mkdir函数来创建目录。如果你想要检查复制目录操作是否成功,你需要自己实现这个功能。

以下是一个简单的示例,展示了如何检查复制目录操作是否成功:

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <dirent.h>
#include <sys/stat.h>
#include <sys/types.h>
#include <unistd.h>

int copy_directory_contents(const char *src, const char *dst) {
    DIR *dir = opendir(src);
    if (dir == NULL) {
        perror("opendir");
        return -1;
    }

    struct dirent *entry;
    while ((entry = readdir(dir)) != NULL) {
        if (strcmp(entry->d_name, ".") == 0 || strcmp(entry->d_name, "..") == 0) {
            continue; // Skip current and parent directory entries
        }

        char src_path[PATH_MAX];
        snprintf(src_path, sizeof(src_path), "%s/%s", src, entry->d_name);

        char dst_path[PATH_MAX];
        snprintf(dst_path, sizeof(dst_path), "%s/%s", dst, entry->d_name);

        struct stat st;
        if (stat(src_path, &st) == -1) {
            perror("stat");
            closedir(dir);
            return -1;
        }

        if (S_ISDIR(st.st_mode)) {
            // Directory, create it in the destination
            if (mkdir(dst_path, st.st_mode) != 0) {
                perror("mkdir");
                closedir(dir);
                return -1;
            }
        } else {
            // File, copy it
            FILE *src_file = fopen(src_path, "rb");
            if (src_file == NULL) {
                perror("fopen");
                closedir(dir);
                return -1;
            }

            FILE *dst_file = fopen(dst_path, "wb");
            if (dst_file == NULL) {
                perror("fopen");
                fclose(src_file);
                closedir(dir);
                return -1;
            }

            char buffer[4096];
            size_t bytes_read;
            while ((bytes_read = fread(buffer, 1, sizeof(buffer), src_file)) > 0) {
                if (fwrite(buffer, 1, bytes_read, dst_file) != bytes_read) {
                    perror("fwrite");
                    fclose(src_file);
                    fclose(dst_file);
                    closedir(dir);
                    return -1;
                }
            }

            fclose(src_file);
            fclose(dst_file);
        }
    }

    closedir(dir);

    // Copy directory attributes
    if (chmod(dst, st.st_mode) != 0) {
        perror("chmod");
        return -1;
    }

    return 0;
}

int main(int argc, char *argv[]) {
    if (argc != 3) {
        fprintf(stderr, "Usage: %s <source_directory> <destination_directory>\n", argv[0]);
        return EXIT_FAILURE;
    }

    const char *src_dir = argv[1];
    const char *dst_dir = argv[2];

    if (copy_directory_contents(src_dir, dst_dir) == 0) {
        printf("Directory copied successfully.\n");
    } else {
        fprintf(stderr, "Failed to copy directory.\n");
        return EXIT_FAILURE;
    }

    return EXIT_SUCCESS;
}

这个程序接受两个命令行参数:源目录和目标目录。它会遍历源目录中的所有文件和子目录,并将它们复制到目标目录中。如果在复制过程中遇到任何错误,它会打印出相应的错误消息并返回-1。如果复制成功,它将返回0。

请注意,这个程序没有处理符号链接、设备文件、命名管道等其他特殊文件类型。如果你需要处理这些类型,你需要添加额外的逻辑来检查文件类型并相应地处理它们。此外,这个程序也没有处理权限问题,如果目标目录没有足够的权限,复制操作可能会失败。

0
看了该问题的人还看了