免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
最近访问板块 发新帖
楼主: redog

文件复制时如何处理文件中的空洞(holes)?? [复制链接]

论坛徽章:
0
发表于 2007-02-01 15:57 |显示全部楼层
每个字节都判断一下
如果是0就做一个lseek
这样行么
呵呵

论坛徽章:
0
发表于 2007-02-01 17:00 |显示全部楼层
原帖由 caijimin 于 2007-2-1 14:38 发表
这应该称作sparse file(稀疏文件),对稀疏文件的判断只能是大致的方法。
stat除了看到size外,还可以看到占用的磁盘block数,假如一个block是4K字节,
block数乘以4k得到的结果远小于文件size,大致可以认为是 ...

哪里有CP的source code?

论坛徽章:
0
发表于 2007-02-01 17:07 |显示全部楼层
原帖由 caijimin 于 2007-2-1 14:38 发表
这应该称作sparse file(稀疏文件),对稀疏文件的判断只能是大致的方法。
stat除了看到size外,还可以看到占用的磁盘block数,假如一个block是4K字节,
block数乘以4k得到的结果远小于文件size,大致可以认为是 ...

一个空洞文件,size = 11,  blksize = 4096, blocks = 8, blksize * blocks = 32768
怎么个比较法?

cp代码在coreutils里,有cp.c

论坛徽章:
0
发表于 2007-02-01 17:07 |显示全部楼层
原帖由 bleem1998 于 2007-2-1 15:57 发表
每个字节都判断一下
如果是0就做一个lseek
这样行么
呵呵


二进制文件怎么办?
不是所有文件都是文本的。

看了CP的代码,CP就是这么做的。。

[ 本帖最后由 anhk 于 2007-2-1 17:45 编辑 ]

论坛徽章:
0
发表于 2007-02-01 17:19 |显示全部楼层
原帖由 anhk 于 2007-2-1 17:07 发表

一个空洞文件,size = 11,  blksize = 4096, blocks = 8, blksize * blocks = 32768
怎么个比较法?

cp代码在coreutils里,有cp.c

谢了,下载去看看.
一直没找到.

论坛徽章:
0
发表于 2007-02-01 17:40 |显示全部楼层
原帖由 lonelyair 于 2007-2-1 17:19 发表

谢了,下载去看看.
一直没找到.


http://61.135.158.199/distfiles/
http://mirror.gentoo.gr.jp/distfiles
这是gentoo的源,里边有几乎所有常用的代码包

[ 本帖最后由 anhk 于 2007-2-1 17:41 编辑 ]

论坛徽章:
0
发表于 2007-02-01 17:50 |显示全部楼层
原帖由 anhk 于 2007-2-1 17:07 发表

一个空洞文件,size = 11,  blksize = 4096, blocks = 8, blksize * blocks = 32768
怎么个比较法?

用du -h 看吧。另外size小于1个block的不能算是sparse吧

论坛徽章:
0
发表于 2007-02-01 17:54 |显示全部楼层

  1. root:temp# cp --sparse=never abc def
  2. root:temp# du abc def
  3. 8        abc
  4. 104      def
  5. root:temp# du -h abc def
  6. 8.0K     abc
  7. 104K     def
  8. root:temp#
复制代码


在linux系统的C语言里,怎么能判断出来呢?  read空洞文件和普通文件是一样的。
只能stat。
可是我stat却出现了上边的数据
原帖由 anhk 于 2007-2-1 17:07 发表

一个空洞文件,size = 11,  blksize = 4096, blocks = 8, blksize * blocks = 32768
怎么个比较法?

[ 本帖最后由 anhk 于 2007-2-1 17:56 编辑 ]

论坛徽章:
0
发表于 2007-02-01 17:59 |显示全部楼层
stat abc: size=100005 blksize=4096 blocks=16 blksize*blocks=65536
stat def: size=100005 blksize=4096 blocks=208blksize*blocks=851968

我闹不清楚这些是什么关系。。

还有,du def 是104K, 与100005怎么都转不到一起,用1000和1024都不行。。

[ 本帖最后由 anhk 于 2007-2-1 18:19 编辑 ]

论坛徽章:
0
发表于 2007-02-01 18:42 |显示全部楼层
原帖由 anhk 于 2007-2-1 17:59 发表
stat abc: size=100005 blksize=4096 blocks=16 blksize*blocks=65536
stat def: size=100005 blksize=4096 blocks=208blksize*blocks=851968

我闹不清楚这些是什么关系。。

还有,du def 是104K, 与 ...


好像block size是512, 4096是IO block size
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP