【问题标题】:How to copy a file on linux from a c program exactly如何从c程序准确复制linux上的文件
【发布时间】:2012-07-17 21:10:11
【问题描述】:

我的意思是保留稀疏文件中的漏洞和所有扩展属性捕获目标文件系统不支持或不完全支持它们的情况(例如不同的 EA 长度)?在挂载的 NTFS 文件系统上,它也应该与备用流一起使用。尽可能多地保留文件属性。

进度 GUI 也需要回调。这似乎是一个难以维护的地狱,所以我想已经有一些东西可以使用了,比如 Windows 上的 SHFileOperation。

我查看了 GLIB,他们以最简单的方式使用打开/读取/写入/关闭顺序进行操作。

【问题讨论】:

  • 我相信你会得到一个很好的答案,所以我不会发布源代码。我会打开源文件 read/binary 和输出文件 write/binary,然后只传输内容。
  • 在 linux 上,sendfile 是一个更好的选择,虽然我不知道它如何处理有漏洞的文件。是否有用于测试漏洞的 API?
  • @KarolyHorvath:最近的内核中有 lseek(2) 和 SEEK_DATA/SEEK_HOLE(自 3.1 起)
  • @Octopusgrabbus:文件比数据流更多。我以为我说清楚了。到目前为止,我发现的 90% 的解决方案都是糟糕且缺乏的。

标签: c linux file copy


【解决方案1】:

sendfile 根本不处理稀疏文件,至少在 Linux 4.4 和更早版本上是这样。从 Linux 4.5 开始,有一个新的系统调用 copy_file_range 为您隐藏了所有细节。

对于早期版本,这里是 my working example 使用 lseekSEEK_HOLE 复制带孔的文件内容。它与 cp 中的实现不同,后者从源中读取所有内容并跳过全零块,因此会在目标中创建空洞,但仍会浪费时间从源中读取空洞。但是,即使某些文件系统已经支持稀疏文件,也很可能不支持 SEEK_HOLE,在这种情况下,我的代码最终会创建非稀疏文件。

至于扩展属性,确实要调用listxattr,然后自己通过getxattr/setxattr复制每个扩展属性。 p>

utimensat/futimens*

可以设置纳米时间戳

【讨论】:

  • 所以linux慢慢变好了。 Unix 狂热分子从不承认他们在技术上落后于 Windows 近 2 年。
  • 在开源模型中变化总是较慢,其中有不同的开发组负责不同的层(内核、驱动程序、libc、系统程序等)。但如果你愿意的话,至少你可以改变任何你想要的东西。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多