如何将特定文件从一个文件夹移动到另一个文件夹?
我尝试了什么,
#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
请指导我如何做到这一点。
答案 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)等...