C 有没有一种方法可以快速确定从(稀疏)文件读取的块是否全为零?

C 有没有一种方法可以快速确定从(稀疏)文件读取的块是否全为零?,c,file,d,sparse-file,C,File,D,Sparse File,有没有一种方法可以快速确定从文件读取的(4KB-16MB)数据块是否全部为零 您可以迭代块,检查每个字节。有明显的优化,但仍然是O(N) 我的用例是针对稀疏文件的。我非常乐意使用部分解决方案,例如,如果我刚刚读取的块没有任何磁盘存储支持(即,它是一个洞),则返回true 有什么提示吗?我的第一个想法是,“rsync是如何做到的?” 结果表明,rsync只是检查数据中的零块,并将它们作为稀疏文件写入。如果需要详细信息,请参阅rsync源代码中的fileio.c。这取决于操作系统,有时取决于文件系统

有没有一种方法可以快速确定从文件读取的(4KB-16MB)数据块是否全部为零

您可以迭代块,检查每个字节。有明显的优化,但仍然是O(N)

我的用例是针对稀疏文件的。我非常乐意使用部分解决方案,例如,如果我刚刚读取的块没有任何磁盘存储支持(即,它是一个洞),则返回true

有什么提示吗?

我的第一个想法是,“rsync是如何做到的?”


结果表明,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后将其保持打开状态。