Recursivley在C中移动目录

时间:2016-01-19 20:42:29

标签: c copy directory move

我试图将一个包含其所有内容的目录移到另一个目录中,而且我被卡住了。我试图将每个文件从源目录复制到目标文件,然后将其删除。我也被困在这里了。但是我可以用rename()函数做某种事。如果是,怎么样?

代码更新

void move_file(const char *name, const char *new_name) {
    size_t len = 0;
    char *buffer;
    long lSize;

    FILE *source = fopen(name, "r");
    FILE *target = fopen(new_name, "w");    

    if (source == NULL || target == NULL) {
        fprintf(stderr, "Error occurred when opening files\n");
        exit(1);
    }

    fseek(source, 0, SEEK_END);
    lSize = ftell(source);
    rewind(source);

    buffer = (char*)malloc(sizeof(char) * lSize);

    result = fread(buffer, 1, lSize, source);

    if (result != lSize) {
        fprintf(stderr, "Reading error\n");
        exit(2);
    }

    fwrite(buffer, 1, sizeof(buffer), target);

    fclose(source);
    fclose(target);

    if (!remove(source)) {
        fprintf(stderr, "Error deleting file\n");
    }
}

我的第二个功能。

void move_directory(const char *target, const char *destination) {
    DIR *dir = opendir(target);

    if (dir) {
        char Path[256];
        char *EndPtr = Path;
        struct dirent *e;
        strcpy(Path, target);
        EndPtr += strlen(target);

        while ((e = readdir(dir)) != NULL) {
            struct stat info;
            strcpy(EndPtr, e->d_name);

            if (!strcmp(e->d_name, ".") || !strcmp(e->d_name, "..")) {
                continue;
            }

            if (!stat(Path, &info)) {
                if (S_ISDIR(info.st_mode)) {
                    move_directory(Path);
                } else
                if (S_ISREG(info.st_mode)) {
                    move_file(e->d_name, e->d_name);
                }
            }
        }
    }
}

我被困了,我不知道如何继续下去。这就是我到目前为止所做的。

更新:我现在如何专注于我的目标文件夹并创建一个与我目前所处的文件夹完全相同的文件夹,我的复制文件应该移到哪里?

1 个答案:

答案 0 :(得分:3)

我对C IO库不是很了解,但我可以指出一些问题

  • 您没有创建目标(子)目录。除非它恰好存在,否则您的副本将失败。
  • 您的路径使用的是硬编码长度,可能太短。 char Path[256]source_file[20]target_file[20]
  • source_file和target_file应该是copy_file的参数,并在move_directory()中被处理,但在copy_file()中声明为堆栈变量。如果这甚至编译,则对于任一变量都没有有意义的值设置。
  • 您正在复制文件,而不是移动它们。如果您希望移动结构,则需要在成功移动后删除文件和目录。
  • 您正在使用fgetc()和fputc()一次复制一个字符。改为使用缓冲操作(fread()/ fwrite())。