当前位置: 首页 > 面试题库 >

使用C在Linux上移动文件

耿永寿
2023-03-14
问题内容
  • 平台:Debian Wheezy 3.2.0-4-686-pae
  • 编译器:GCC(Debian 4.7.2-5)4.7.2(代码:: Blocks)

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


问题答案:

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

而且,如果源和目标位于不同的文件系统上,则没有办法使移动成为原子,并避免出现竞争条件(因此,在可能的情况下,最好使用named(2),因为根据其手册页是原子的)。在移动操作期间,始终可以(通过另一个过程)修改源文件…

因此,移动文件的一种实用方法是首先尝试执行rename(2),如果失败EXDEV(当 oldpathnewpath
不在同一安装的文件系统上),则需要复制字节和元数据。一些库提供了执行此操作的功能,例如Qt QFile ::
rename。

阅读高级Linux编程以获取更多信息(并尝试输入strace一些mv命令以了解其功能)。该书可免费合法下载(因此您可以在网上找到几本)。



 类似资料:
  • 问题内容: 是否有使用C 读取用于Linux的INI文件等配置的标准方法? 我正在基于Linux的手持设备上工作,并用C编写代码。 否则,我想知道其他选择。 最终更新: 我已经探索甚至使用过LibConfig。但是占用空间很大,而且我的用法太简单了。因此,为了减少占用空间,我推出了自己的实现。该实现不是太通用,实际上到目前为止已经相当耦合了。启动应用程序时,配置文件将被解析一次,并设置为一些全局变

  • 问题内容: 我知道如何在Mac OS上使用Xcode在Swift中访问C库,并且在Linux上也知道,但是如何在Linux上使用Swift这样的C库,如OpenGL? 问题答案: 使用系统模块导入OpenGL头文件:https : //github.com/apple/swift-package- manager/blob/master/Documentation/SystemModules.md

  • 问题内容: 我想使用系统蜂鸣器(并且只有在没有蜂鸣器/无法访问蜂鸣器时才使用扬声器)生成具有特定频率和长度(针对不同的声音信号)的蜂鸣声。我知道可以通过使用ioctl来做到这一点,但这需要root访问权限,而这是我所不希望的。 我知道我可以只使用“ beep”命令,但这将是一个依赖关系,如果可能的话,不应使用它(根本没有外部依赖关系,只有基本的linux库和C)。 我目前拥有的是以下代码(但这需要

  • 问题内容: [我已经以二进制模式将csv文件移动到Linux系统中。一个字段的文件内容被分成多行,其注释部分,我需要删除新行,保持相同的格式,请在shell命令或perl命令上提供帮助 这是三个记录的示例,实际看起来像] 文件的原始内容 [进入linux后,注释字段分为4行,我想保持注释字段的格式相同,但不希望换行符 “第一行 第二行 第三行所有行格式都不应更改”] 2 问题答案: 正如我在上面的

  • 问题内容: 我正在寻找解决上述问题的解决方案。 这是我的“无效代码”。charsInCurrentBuffer始终返回-1! 问题答案: 当你从FD中,“用户的定位缓冲区和文件偏移都必须是文件系统的逻辑块大小的倍数”(引自手册页在Linux上)。其他环境对此可能有不同的约束,并且实际上是依赖于文件系统的。 通常情况并非如此(除非您很幸运)。 如果平台具有该功能,则应考虑使用该功能,或者只是分配一个

  • 我有一个ASP。NET文件上载控件,当您单击上载按钮选择要上载的文件时,该控件将打开一个窗口。但问题是,网络驱动程序无法识别窗口,因此无法选择要上载的文件。 我在stackoverflow中找到了许多使用sendkey输入文件路径的解决方案。我认为当你有html文件上传控制时,这是有效的。在我的情况下,我有ASP。NET文件上传控件,它没有文本框,我可以在其中使用sendkey输入文件路径。 我该