如何将文件从一个文件夹移动到linux中的不同文件夹

时间:2013-11-23 10:34:14

标签: c++ c linux mv

如何将特定文件从一个文件夹移动到另一个文件夹?

我尝试了什么,

#include <stdio.h>

int main() {
    FILE *tFile;
    if (tFile != NULL)
        tFile = NULL;
    if ((tFile = fopen("TempFile.txt", "rw")) == NULL) {
        return -1;
    }

    mv("TempFile.txt", "../MST");

    printf("Done Succesfully\n");
    return 0;
}

错误:

test.c:17:2: warning: no newline at end of file
/tmp/ccKLWYNa.o(.text+0x5e): In function `main':
: undefined reference to `mv'
collect2: ld returned 1 exit status

请指导我如何做到这一点。

1 个答案:

答案 0 :(得分:9)

你真的应该阅读Advanced Linux Programming

要将文件从一个地方移动(从C)到同一文件系统中的另一个 ,只需使用rename(2)系统调用。

至少,对于您的特定示例,您需要编码:

char* srcpath = "TempFile.txt"; // assume it is a variable path
char destpath[1024];
snprintf (destpath, sizeof(destpath), "../MST/%s", srcpath);
if (rename (srcpath, destpath)) {
   // something went wrong
   if (errno == EXDEV) {
      // copy data and meta data 
   } else { perror("rename"); exit(EXIT_FAILURE); };
} 
else { // the rename succeeded
}

如果您真的想mv TempFile.txt ../MST/TempFile.txt专门针对TempFile.txt,那么您只需拨打rename("TempFile.txt", "../MST/TempFile.txt")并按照我的建议处理错误案例。如果您确定../MST/位于与.相同的文件系统中,那么EXDEV不应该发生,您不需要特别处理它(但您确实需要处理错误)

如果要在两个不同的文件系统之间移动文件,则必须自己复制数据(可能还有一些元数据)(然后使用unlink(2)删除原始源文件) 。您可以通过各种方式检测到这种情况:您可以尝试rename,如果errno(请参阅errno(3))是EXDEV则需要复制文件。或者您可以使用stat(2)查询源文件(以及目标目录)元数据-e.g.它的大小和文件系统。

当然,你需要了解Linux(或Posix)上的文件是什么,特别是inode ....

您可以将system/bin/mv一起使用(但要注意文件路径中的奇怪字符 - 类似空格或分号 - 您需要将它们转义以避免code injection),显然你不想。

您应该在ltrace的各种情况下使用strace(1)(或者也可能mv)来了解它正在做什么。另外,请研究GNU coreutils的源代码,该代码在mv.c中提供/bin/mv ...

一些额外的C或C ++库可能为您提供移动文件的功能(在同一文件系统中它们应该执行rename,在不同的文件系统中它们复制源文件数据,也许还有一些元数据和取消链接来源,所以不能是原子的,例如在C g_file_move(来自Gio,来自Gnome的Glib),或者来自C ++ copy_file - 跟随remove在Boost等等......

PS。对于临时文件,请参阅tmpfile(3)mkstemp(3)等...