我需要复制稍后将在iOS设备上修改的文件。出于性能原因,如果这可以在写入时复制,即文件不是真正重复,并且稍后只写入修改过的副本块,那将是很好的。
正如评论中所指出的,这可能必须得到文件系统(HFS +?)的支持。链接是不够的,因为旧的(A)和新的(B)文件名都指向同一个文件,如果我修改A,B也会改变。
“懒惰”副本也无济于事,因为在第一次写入时,仍然需要复制整个文件。
我正在考虑更多关于@Hot Licks描述的解决方案,它将使用磁盘上相同的块从A和B开始,当我写入文件B时,只有修改过的块会存储在磁盘上,而A和B中相同的部分继续在磁盘上使用相同的块。
这可以在iOS上使用吗?
此致 约亨
答案 0 :(得分:0)
没有用于执行文件的高效部分副本的内置机制,但如果您正在复制文件并对内容进行内部更改,那么最有效的机制是使用mmap。您将文件映射到内存并就地修改它。更改将自动写回文件,而无需将文件重新分段。
#include <fcntl.h>
#include <sys/stat.h>
#include <sys/types.h>
#include <sys/mman.h>
struct stat astat;
int fd = open("filename", O_RDWR);
if ((fd != -1) && (fstat(fd, &astat) != -1)) {
char *data = mmap(0, astat.st_size, PROT_READ | PROT_WRITE, MAP_SHARED, fd, 0);
if (data != MAP_FAILED) {
self.data_ptr = data;
self.data_size = astat.st_size;
}
close(fd);
}
完成文件后,使用munmap将映射释放回os:
munmap(self.data_ptr, self.data_size);
通常的警告适用于修改共享资源。