在C中移动Linux上的文件

时间:2013-07-03 01:50:23

标签: c linux

  • 平台:Debian Wheezy 3.2.0-4-686-pae
  • Complier:GCC(Debian 4.7.2-5)4.7.2(Code :: Blocks)

我想将文件从一个位置移动到另一个位置。没有什么比移动到不同的驱动器或不同的文件系统更复杂。我知道执行此操作的“标准”方法是简单地复制文件然后删除原始文件。但我想要一些方法来保留文件的所有权,模式,上次访问/修改等。我假设我将不得不复制文件,然后编辑新文件的所有权,模式等,但我不知道如何做到这一点。

2 个答案:

答案 0 :(得分:16)

如果文件的原始位置和新位置位于同一文件系统上,则“移动”在概念上与“rename”相同。

#include <stdio.h>

int rename (const char *oldname, const char *newname)

答案 1 :(得分:16)

如果您无法使用rename(2)系统调用(例如,因为源和目标位于不同的文件系统上),您必须使用stat(2)查询源文件的大小,权限和其他元数据;使用read(2)write(2)(使用几千字节的缓冲区),open(2)close(2)以及使用chmod(2)chown(2)的元数据复制数据,utime(2)。您可能还关心使用getxattr(2)setxattr(2)listxattr(2)复制属性。在某些情况下,您也可以sendfile(2)使用David C. Rankin

如果源和目标位于不同的文件系统上,则无法使原子移动并避免竞争条件(因此,如果可能,最好使用rename(2),因为根据其手册页它是原子的) 。在移动操作期间,始终可以修改源文件(通过其他进程...)

所以移动文件的实用方法是首先尝试执行rename(2),如果失败则使用EXDEV(当 oldpath newpath 不在同一个挂载的文件系统上),那么你需要复制字节和元数据。几个库提供了这样做的功能,例如, Qt QFile::rename

阅读Advanced Linux Programming了解更多信息(并尝试使用strace某些mv命令来了解它的作用。这本书是免费和合法下载的(所以你可以在网上找到几个副本)。