当前位置: 技术问答>linux和unix
文件空洞的问题
来源: 互联网 发布时间:2016-07-30
本文导语: 《APUE》的4.6题“编写一个类似cp(1)的程序,他复制包含空洞的文件,但不将字节0写到输出文件中” 如果仅仅简单的查看是否字节是0,然后输出连续的0的字节数,用feek跳过再复制其它的内容,可以产生空洞文件。...
《APUE》的4.6题“编写一个类似cp(1)的程序,他复制包含空洞的文件,但不将字节0写到输出文件中”
如果仅仅简单的查看是否字节是0,然后输出连续的0的字节数,用feek跳过再复制其它的内容,可以产生空洞文件。但是如果原来的文件故意写了很多0,而不是真的空洞,那么产生的文件含有空洞,而比原来的文件占用的磁盘空间小。用系统的cp命令就不会产生这种问题。那么这题应该如何解决,区分真正的空洞和人工写的0?
如果仅仅简单的查看是否字节是0,然后输出连续的0的字节数,用feek跳过再复制其它的内容,可以产生空洞文件。但是如果原来的文件故意写了很多0,而不是真的空洞,那么产生的文件含有空洞,而比原来的文件占用的磁盘空间小。用系统的cp命令就不会产生这种问题。那么这题应该如何解决,区分真正的空洞和人工写的0?
|
搞定了!!!
我查了cp的源码,找到关键的位置:
最后一句就是关键的所在:通过比较文件的大小和实际占用的block来判断稳健有没有空洞,然后进行copy~所以cp不会带来楼主说的问题,自己编的时候要加上这么一句哦~
哈哈!终于搞定了,好有成就感!接分!
我查了cp的源码,找到关键的位置:
#if HAVE_STRUCT_STAT_ST_BLOCKS
if (x->sparse_mode == SPARSE_AUTO && S_ISREG (sb.st_mode))
{
/* Use a heuristic to determine whether SRC_PATH contains any
sparse blocks. */
if (fstat (source_desc, &sb))
{
error (0, errno, _("cannot fstat %s"), quote (src_path));
return_val = -1;
goto close_src_and_dst_desc;
}
/* If the file has fewer blocks than would normally
be needed for a file of its size, then
at least one of the blocks in the file is a hole. */
if (S_ISREG (sb.st_mode)
&& sb.st_size / ST_NBLOCKSIZE > ST_NBLOCKS (sb))
make_holes = 1;
}
最后一句就是关键的所在:通过比较文件的大小和实际占用的block来判断稳健有没有空洞,然后进行copy~所以cp不会带来楼主说的问题,自己编的时候要加上这么一句哦~
哈哈!终于搞定了,好有成就感!接分!