复制c中的子目录

时间:2017-04-16 06:55:34

标签: c file directory copy

是否有人知道如何将目录(包括所有子目录)复制到另一个文件夹 到目前为止,我编写的代码复制了文本文件和目录,但它并没有复制所有子目录。在继续之前,我之前已经看过这样的问题,但是我不知道我需要知道什么,或者有其他语言的内容。

很抱歉,如果我的代码很乱。

无论如何,这是我的代码:

#include <unistd.h>
#include <string.h>
#include <errno.h>
#include <fcntl.h>
#include <stdbool.h>
#include <sys/stat.h>
#include <dirent.h>
#include <stdio.h>
#include <unistd.h>
#include <stdlib.h>

#define BUFFERSIZE 4096
#define COPYMODE 0644
#define FILE_MODE S_IRWXU

DIR * directory;
struct dirent * entry;
DIR * directoryTwo;
struct dirent * entryTwo;
struct stat info;

// copyFile

void copyFile(const char * src, const char * dst)
{
    FILE * file1, *file2;
    file1 = fopen(src, "r");
    if(file1 == NULL)
    {
        perror("Cannot open source file");
        fclose(file1);
        exit(-1);
    }

    file2 = fopen(dst, "w");

    if(file2 == NULL) {
        perror("cannot open destination file");
        fclose(file2);
        exit(-1);
    }

    char currentchar;
    while((currentchar = getc(file1)) != EOF) {
        fputc(currentchar, file2);
    }

    fclose(file1);
    fclose(file2);
}

void goThoughFile(const char * srcFilePath, const char * dst)
{
    char srcFile[260];
    char dstFile[260];

    directory = opendir(srcFilePath);
    if(directory == NULL) {
        printf("Error");
        exit(1);
    }

    while((entry = readdir(directory)) != NULL)
    {
        if(strstr(entry->d_name, "DS_Store") || strstr(entry->d_name, ".localized") ||
                strstr(".", &entry->d_name[0]) || strstr("..", &entry->d_name[0]))
            continue;

        else if(entry->d_type == DT_REG)
        {
            sprintf(srcFile, "%s/%s", srcFilePath, entry->d_name);
            sprintf(dstFile, "%s/%s", dst, entry->d_name);
            copyFile(srcFile, dstFile);
        }

        if(entry->d_type == DT_DIR)
        {
            chdir(dst);
            mkdir(entry->d_name, S_IRWXU);
            sprintf(dstFile, "%s%s/%s", dst, entry->d_name, "/..");
            chdir(dstFile);
            mkdir(entry->d_name, S_IRWXU);
        }
    }
}

int main()
{
    goThoughFile(someFilePath, anotherFilePath);
    return 0;
}

1 个答案:

答案 0 :(得分:0)

使用struct dirent想要实现的目标无法保证有效。

您正在检查if(entry->d_type == DT_DIR)文件类型目录,但如果您阅读readdir(3)手册,则在结构注释中明确指出所有文件系统类型都不支持。

On Linux, the dirent structure is defined as follows:

       struct dirent {
           ino_t          d_ino;       /* inode number */
           off_t          d_off;       /* not an offset; see NOTES */
           unsigned short d_reclen;    /* length of this record */
           unsigned char  d_type;      /* type of file; not supported
                                          by all filesystem types */
           char           d_name[256]; /* filename */
       };

您必须使用getdents()。 有关更多说明,请参阅此post