C 有没有一种方法可以快速确定从(稀疏)文件读取的块是否全为零?
有没有一种方法可以快速确定从文件读取的(4KB-16MB)数据块是否全部为零 您可以迭代块,检查每个字节。有明显的优化,但仍然是O(N) 我的用例是针对稀疏文件的。我非常乐意使用部分解决方案,例如,如果我刚刚读取的块没有任何磁盘存储支持(即,它是一个洞),则返回true 有什么提示吗?我的第一个想法是,“rsync是如何做到的?”C 有没有一种方法可以快速确定从(稀疏)文件读取的块是否全为零?,c,file,d,sparse-file,C,File,D,Sparse File,有没有一种方法可以快速确定从文件读取的(4KB-16MB)数据块是否全部为零 您可以迭代块,检查每个字节。有明显的优化,但仍然是O(N) 我的用例是针对稀疏文件的。我非常乐意使用部分解决方案,例如,如果我刚刚读取的块没有任何磁盘存储支持(即,它是一个洞),则返回true 有什么提示吗?我的第一个想法是,“rsync是如何做到的?” 结果表明,rsync只是检查数据中的零块,并将它们作为稀疏文件写入。如果需要详细信息,请参阅rsync源代码中的fileio.c。这取决于操作系统,有时取决于文件系统
结果表明,rsync只是检查数据中的零块,并将它们作为稀疏文件写入。如果需要详细信息,请参阅rsync源代码中的
fileio.c
。这取决于操作系统,有时取决于文件系统。Linux自2.6.28开始就实现了,Solaris上的ZFS在lseek()
中实现了SEEK\u-HOLE
和SEEK\u-DATA
,我认为这个问题与操作系统API的关系比任何特定的编程语言都要密切。如果有一种方法,很可能是(V)FS API特有的。。所以这取决于操作系统和FS本身。@David Linux(EXT3/4)和Windows(NTFS)。AFAIK OSX不做稀疏文件。FWIW,在即将发布的3.1内核中,Linux还实现了SEEK_-HOLE/SEEK_-DATA。我不认为这也适用于mmapped文件?这似乎是合理的。@chrisdew:FIEMAP
将在文件描述符上工作,如果您在创建mmap后将其保持打开状态。