我正在尝试了解 Linux (UNIX) 低级接口,并且作为练习想要编写一个代码,它将带有孔的文件复制到一个新文件中(同样带有孔)。
所以我的问题是,如何从第一个文件中读取,而不是直到第一个洞,而是直到文件的最后?如果我没记错的话,read()
到达第一个洞(EOF)时返回 0。
我正在考虑逐字节寻找正确的字节并尝试读取这个字节,但是我必须提前知道孔的数量。
如果孔是指稀疏文件,那么您必须在输入文件中找到孔并在写入输出文件时使用lseek重新创建它们。从 Linux 3.1 开始,您甚至可以使用lseek
跳转到孔的开头或结尾,如手册页中详细描述的那样。
正如 ThiefMaster已经指出的那样,正常的文件操作会将漏洞简单地视为零字节序列,因此您不会看到您提到的 EOF。
文件没有显示,好像它有任何间隙。如果您的意图是说该文件在磁盘的一个区域上有部分,然后在另一个区域上有更多部分,等等,您将无法通过open()
对该文件的调用和一系列调用来看到这一点read()
。相反,您需要open()
和read()
原始磁盘相反,自行寻找扇区。
如果您对文件中“漏洞”的含义如@ThiefMaster 所说,则只是0字节的区域-根据您的应用程序对数据的使用,这些只是“漏洞”;对于文件系统,它们只是文件中的字节,与其他文件没有什么不同。在这种情况下,您可以通过简单读取数据源并将其写入数据目标来复制它,您将获得完整副本(以及您所谓的孔)。
对于稀疏文件的副本,来自cp
手册;
默认情况下,稀疏的 SOURCE 文件由粗略的启发式检测,相应的 DEST 文件也变得稀疏。那是 选择的行为--sparse=auto
。指定--sparse=always
在 SOURCE 文件包含足够长的零字节序列时创建稀疏 DEST 文件。用于--sparse=never
禁止创建稀疏文件。
因此,--sparse=always
如果您需要“按原样”复制稀疏文件(似乎仍受算法影响) ,请尝试