【问题标题】:C++ / C: Move Directory to Another LocationC++ / C:将目录移动到另一个位置
【发布时间】:2012-09-29 09:17:08
【问题描述】:

我想将一个目录的内容移动到另一个目录。我通过命令行参数指定源目录和目标目录。代码如下:

#include <stdlib.h>
#include <stdio.h>

void move_dir(FILE *src, FILE *dest) {
    int c = getc(src);
    while(getc(src)!=EOF) {
        putc(c,dest);
    }
}

int main(int argc, char* argv[])
{
    FILE *src=fopen(argv[1]);
    FILE *dest=fopen(argv[2]);
    while(--argc>0) {
        if(src!=NULL && dest!=NULL) {
            move_dir(src,dest);
        }
    }
    fclose(src);
    fclose(dest);
    return 0;
}

例如:

./a.out /Folder1/Folder2/Source /Folder1

这会将名为 Source 的文件夹移动到 Folder1 内。但是,当我执行此代码时,它不起作用。它用 g++ 编译得很好,运行时没有错误,但它根本不移动任何东西。关于可能出错的任何想法?

【问题讨论】:

  • 你应该养成用g++ -Wall -g编译的习惯
  • 你想制作相当于mv的命令吗?不同文件系统上的目录呢?

标签: c linux file unix directory


【解决方案1】:

编辑:这是指原始帖子,内容为FILE * src = opendir( argv[1] );

函数opendir()返回一个DIR *,它与FILE *有很大的不同(不能作为getc()/putc()的参数。

您必须使用 readdir() 从该 DIR * 读取目录条目,这将产生一个文件名,然后使用该信息复制该文件。

编辑:这是指更新后的帖子。

您不要在目录上使用文件函数(fopen()getc() 等)。要走的路是opendir(),后跟readdir(),然后作用于生成的文件名。

我真的不知道为什么目录上的fopen() 实际上返回一个非空指针。就个人而言,我认为这是一个设计缺陷,因为没有为目录定义FILE * 上可能的操作。我会很好远离这个结构。


一般来说,您应该阅读您正在使用的函数的文档(手册页),而不是(错误地)假设它们。当你这样做的时候,也要检查返回值——它们可能会告诉你为什么事情没有按预期工作。

【讨论】:

  • 但是您应该使用opendir 读取目录,然后对其中的每个条目进行操作。
  • @CharlieYabben:你不能fopen() 一个目录,这让我马上回到“检查返回值”。
  • @BasileStarynkevitch 啊,好吧,所以我需要先执行 opendir,然后执行单个文件操作来移动文件?
  • @CharlieYabben:这就是我写的,是的。
  • 关于我上面关于“你不能fopen()一个目录”的评论,我很惊讶,实际上,你可以。我不知道为什么fopen() 在这种情况下返回非NULL,但恕我直言它应该......
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-05-16
  • 1970-01-01
  • 2011-11-13
  • 1970-01-01
  • 1970-01-01
  • 2016-10-14
相关资源
最近更新 更多