当前位置:  技术问答>linux和unix

如何设置文件的大小?要求不需要往文件中写入东西,就可以扩展文件的大小

    来源: 互联网  发布时间:2016-12-30

    本文导语:  例如在Linux下,我想创建一个大小为64字节的文件. lseek(fd,62,SEEK_SET) write(fd," ",1); //eof占用一个字节。 struct stat buf; fstat(fd,&buf); buf.st_size;//该值居然是0. 请问我应该如何编写代码才能够达到我的目的? ...

例如在Linux下,我想创建一个大小为64字节的文件.


lseek(fd,62,SEEK_SET)
write(fd," ",1);
//eof占用一个字节。

struct stat buf;
fstat(fd,&buf);

buf.st_size;//该值居然是0.



请问我应该如何编写代码才能够达到我的目的?

|
别在意,程序里增加文件大小的办法都是你这样,mmap前经常这样做。

|
设置文件偏移量中间产生的文件空洞并不会占空间...

|
Linux对稀疏(Sparse)文件的支持

稀疏(Sparse)文件可以节省大量的磁盘空间,允许将文件中的空洞保留但不占用磁盘空间,填充空洞时再分配空间。目前很多文件系统都支持。下面介绍了Linux对稀疏(Sparse)文件的支持。

稀疏(Sparse)文件的创建

在EXT2/EXT3文件系统上可以使用dd创建稀疏文件:
$ dd if=/dev/zero of=fs.img bs=1M seek=1024 count=0
0+0 records in
0+0 records out
$ ls -lh fs.img
-rw-rw-r--  1 zhigang zhigang 1.0G Feb  5 19:50 fs.img
$ du -sh fs.img
0       fs.img
使用C语言来创建一个稀疏文件的方法如下:
$ cat sparse.c
#include 
#include 
#include 
#include 

int main(int argc, char *argv[])
{
    int fd = open("sparse.file", O_RDWR|O_CREAT);
    lseek(fd, 1024, SEEK_CUR);
    write(fd, "", 1);

    return 0;
}


$ gcc -o sparse sparse.c
$ ./sparse
$ ls -l sparse.file
-r-x--x---  1 zhigang zhigang 1025 Feb  5 23:12 sparse.file
$ du sparse.file
4       sparse.file
使用python来创建一个稀疏文件的方法如下:
$ cat sparse.py
#!/usr/bin/env python
f = open('fs.img', 'w')
f.seek(1023)
f.write('n')

$ python sparse.py
$ ls -l fs.img
-rw-rw-r--  1 zhigang zhigang 1024 Feb  5 20:15 fs.img
$ du fs.img
4       fs.img

文件稀疏化(sparsify)

下面的方法都可以将一个文件稀疏化。

cp:
$ cp --sparse=always file file.sparse
cp缺省使用--sparse=auto,会自动探测源文件中是否有空洞,以决定目标文件是否为稀疏文件;使用--sparse=never会禁止创建稀疏文件。
cpio:
$ find file |cpio -pdmuv --sparse /tmp
如果不加--sparse参数,稀疏文件中的空洞将被填满。
tar:
$ tar cSf - file | (cd /tmp/tt; tar xpSf -)
如果不加 -S --sparse参数,稀疏文件中的空洞将被填满。
文件稀疏化(sparsify)效率比较

下面我们创建一个500M的稀疏文件,比较一下几种文件稀疏化方法的效率。
$ dd if=/dev/zero of=file count=100 bs=1M seek=400
100+0 records in
100+0 records out
$ time cp --sparse=always file file.sparse
real    0m0.626s
user    0m0.205s
sys     0m0.390s

$ time tar cSf - file | (cd /tmp; tar xpSf -)
real    0m2.732s
user    0m1.706s
sys     0m0.915s

$ time find file |cpio -pdmuv --sparse /tmp
/tmp/file
1024000 blocks
real    0m2.763s
user    0m1.793s
sys     0m0.946s
由此可见,上面几种文件稀疏化的方法中,cp的效率最高;tar和cpio由于使用管道,效率下降。
使EXT2/EXT3文件系统稀疏化(sparsify)

如何是一个文件系统的映像文件稀疏化?Ron Yorston为大家提供了几种方法,我觉得下面的方法最简单:
使用Ron Yorston的zerofree将文件系统中未使用的块清零。
$ gcc -o zerofree zerofree.c -lext2fs
$ ./zerofree fs.img
使用cp命令使映像文件稀疏化:
$ cp --sparse=always fs.img fs_sparse.img
EXT2/EXT3文件系统的sparse_super参数

这个参数与EXT2/EXT3是否支持Sparse文件无关;当打开该参数时,文件系统将使用更少的超级块(Super block)备份,以节省空间。

如下的命令可以查看该参数:
# echo stats | debugfs /dev/hda2 | grep -i features
Filesystem features:      has_journal ext_attr resize_inode dir_index filetype needs_recovery sparse_super large_file
或者:
# tune2fs -l /dev/hda2 |grep "Filesystem features"
Filesystem features:      has_journal ext_attr resize_inode dir_index filetype needs_recovery sparse_super large_file
可以通过使用:
# tune2fs -O sparse_super
或者:
# tune2fs -s [0|1]
来设置该参数。

参考资料

Keeping filesystem images sparse: http://intgat.tigress.co.uk/rmy/uml/sparsify.html.

    
 
 

您可能感兴趣的文章:

  • MyEclipse如何查看和设置文件编码格式相关操作
  • 请问怎样把一个目录下的所有文件夹属性设置为755,文件设置为644?
  • 设置sharepoint 2010文档库中的 pdf文件在浏览器中访问的打开方式
  • linux中端口号设置是在哪个配置文件,该如何设置?
  • CentOS yum 源设置为163的源操作步骤及配置文件参考
  • destoon安全设置中需要设置可写权限的目录及文件
  • Ubuntu程序开机自动启动设置(服务和自动运行配置文件)的几种方法
  • 高手指教:为何对文件的一块区域设置了读锁,仍可以设置写锁
  • centos6网络配置及网卡设置相关命令及配置文件
  • 在vmware下设置了共享的Windows文件后,怎么在ubuntu里面查看这个文件夹?
  • Linux下c/c++开发之程序崩溃(Segment fault)时内核转储文件(core dump)生成设置方法
  • 设置密码保护的SqlServer数据库备份文件与恢复文件的方法
  • Linux中如何设置文件以及文件夹的颜色?
  • GCC编译程序时,有自定义头文件,提示找不到该头文件,但他就在这个目录中,如何设置GCC参数?
  • Linux 如何设置某文件是文件夹
  • 请教/var/adm/wtmpx文件的最大大小是多少?是一个数值还是一个与文件系统的比值?是如何设置大小限制的?谢谢!!
  • 设置nfs做为根文件系统问题
  • 如何设置删除文件时需要密码?
  • linux 如何设置文件的用户和组?
  • linux下如何设置文件夹权限属于多个组?
  • Linux中的文件权限设置问题
  • C++ Strings(字符串) 成员 resize():重新设置字符串的大小
  • 怎么样让我的JFrame的大小设置为:显示器屏幕大小减去Windows任务栏后的大小?
  • 如何设置java的堆初试大小-ms和最大大小-mx?最好以JBuilder5为例。
  • 设置发送缓冲区bufsize大小失败?
  • linux下需要设置网络发送和接受缓冲区大小时,需如何设置,是否系统有最大缓冲区限制?谢谢
  • 在Jbuilder中,如何设置一个按钮的初始位置以及初始化按钮的大小?
  • 菜鸟问题,Java图形编程里,怎么设置一个panel的大小?
  • android开发教程之用命令启动android模拟器并设置其内存大小
  • 如何设置JBuilder5的栈大小?
  • 请问如何设置JTabel的COLUMN(列名)的字体大小?望告知
  •  
    本站(WWW.)旨在分享和传播互联网科技相关的资讯和技术,将尽最大努力为读者提供更好的信息聚合和浏览方式。
    本站(WWW.)站内文章除注明原创外,均为转载、整理或搜集自网络。欢迎任何形式的转载,转载请注明出处。












  • 相关文章推荐
  • 数据库写不进去IIS写入权限怎么设置
  • [SAMBA问题]文件无法写入及多组权限设置
  • C++ Bitsets 成员 count():返回被设置的位的个数
  • 在使用gcc之前,需要先设置环境吗?如何设置?在线等!!!
  • C++ I/O 成员 precision():设置精度
  • 用grub能否设置启动密码?如何设置?
  • C++ Bitsets 成员 any():如果有任何一个位被设置就返回true
  • 在linux服务器上面设置squid后怎么设置可以使客户端能使用QQ?
  • C++ Double Ended Queues(双向队列) 成员 assign():设置双向队列的值
  • 请问设置一个和root权限差不多的用户怎么设置?
  • C++ Vectors 成员 reserve():设置Vector最小的元素容纳数量
  • 用JSP。XML开发网站。请问那种环境设置最好。该如何设置环境
  • C++ Bitsets 成员 set():设置位
  • 环境变量设置设置与显示不一致
  • C++ Bitsets 成员 none():如果没有位被设置则返回true
  • linux下到底如何设置环境变量?在哪设置?详细具体点
  • Windows7自带防火墙设置:启动,关闭及高级设置
  • 紧急求救各位了:linux下有没有有设置报文最小长度的命令(好像只有设置报文最大长度MTU,通过ifconfig)?
  • C++ Strings(字符串) 成员 reserve():保留一定容量以容纳字符串(设置capacity值)
  • 怎么设置在Linux上面设置WEB服务器?请各位高手指教!!!
  • C++ I/O 成员 setf():设置格式标志
  • 100求救 jrun3.0 里的beans的设置,你登陆我的机器设置
  • IE11设置IE兼容性视图及提升Windows 8.1中IE11兼容性的相关设置
  • linux 如何用SOCKET设置函数设置阻塞和非阻塞?


  • 站内导航:


    特别声明:169IT网站部分信息来自互联网,如果侵犯您的权利,请及时告知,本站将立即删除!

    ©2012-2021,,E-mail:www_#163.com(请将#改为@)

    浙ICP备11055608号-3