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

标签 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

请指导我该怎么做。

最佳答案

你真的应该读一读Advanced Linux Programmingsyscalls(2)

要(从 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 只你可以调用 重命名("TempFile.txt", "../MST/TempFile.txt") 并按照我的建议处理错误情况。如果您确定 ../MST/ 位于与 . 相同的文件系统中,那么 EXDEV 不应该发生并且您不需要专门处理它(但你确实需要处理错误)。

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

当然,您需要了解什么是 Linux(或 Posix)上的文件,特别是什么是 inode。 ....见inode(7)credentials(7)

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

你应该玩strace(1) (或者可能还有 ltrace)在各种情况下 mv 以了解它在做什么。另外,研究 GNU coreutils 的源代码它在 mv.c 中提供了 /bin/mv ...

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

附言。对于临时文件,请参阅 tmpfile(3) , mkstemp(3)等等……

关于c - linux中如何将文件从一个文件夹移动到不同的文件夹,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20161243/

相关文章:

python - 用 C 函数扩展 Numpy

c - 为什么 int array[1000][1000] 是 C 程序中的内存问题?

php - 通过适用于 Linux 的 Chef Recipe 在 php.ini 中启用 php_oci8_11g 扩展

bash - 重命名文件但将它们保留在当前的子目录中

linux - 将目录从 abc.folder.xyz 重命名为folder.xyz

c - 为什么函数不应该返回本地数组?

c - 如何在 C 函数中返回超过 1 个值?

linux - Bash 脚本 - 仅更改一列中的值

java - 从 bin 文件夹运行 logstash 脚本并设置 java.io.tmpdir

unix - 使用 mv 命令 - 文件已删除?