【问题标题】:Recursivley move directory in C在C中递归移动目录
【发布时间】:2016-04-25 12:03:43
【问题描述】:

我试图将一个目录及其所有内容移动到另一个目录中,但我被卡住了。我正在尝试将每个文件从源目录复制到目标目录,然后将其删除。我也陷入了困境。但是我能以某种方式使用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);
                }
            }
        }
    }
}

我被困住了,我不知道应该如何进行。这就是我目前所拥有的。

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

【问题讨论】:

  • 请详细说明“我被卡住了”:您已经走了多远,您遇到了哪些问题?
  • 这就是我所拥有的一切。我很不知道要在我想搬家的地方和地点之间建立联系。我再次尝试复制每个文件。在这种情况下可以使用 rename() 吗?
  • rename() 要求两个文件位于同一文件系统上。您不能使用它将目录从一个磁盘移动到另一个磁盘。 gnu.org/software/libc/manual/html_node/Renaming-Files.html
  • 那么,唯一的解决方案是复制每个文件然后删除它?但是我仍然不知道如何在要复制的内容和要复制的位置之间建立联系...

标签: c copy directory move


【解决方案1】:

我对 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())。

【讨论】:

  • 我没有编译这个,因为它还没有准备好,没有任何编译的理由。这对我也有用,我的 C 语言不太好,这就是我问的原因,因为我确实知道其中的逻辑。这个想法是移动结构,我知道有一个函数rename() 可以移动当前目录中的文件。我实际上是在尝试复制,以模拟移动,然后删除文件。
  • rename() 仅适用于同一个文件系统,因此您不能使用它将文件从一个磁盘移动到另一个磁盘或网络驱动器。
  • 并且代码不检查"."".."条目,这将导致无限递归。而且代码不会在任何地方调用mkdir,这意味着它不可能工作。
  • @user3386109:我提到没有创建目录,但是忽略... 很好。
  • 您好,我已经修改了一些代码并更新了它,你们可以看看吗?而且我仍然不知道,我如何专注于目标并在那里创建一个文件夹,然后我应该在其中复制我的文件。 ?
猜你喜欢
  • 2011-06-22
  • 2010-12-01
  • 2016-12-01
  • 2016-04-18
  • 2013-02-17
  • 2013-07-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多