在UNIX/LINUX系统中,文件位移量可以大于文件的当前长度,这种情况下向文件中写入数据就会产生文件空洞(hole),这些没写入数据的文件空洞部分默认会被0填满。虽然这些文件空洞并没有实际的数据,但是它们仍然占据硬盘空间。

  在Windows下同样支持这种文件空洞,以下简单的代码产生一个6KB的空洞文件:

#include <afx.h>
#include <iostream> using namespace std; int _tmain(int argc, _TCHAR* argv[])
{
CFile testFile(_T("D:\\test"), CFile::modeCreate | CFile::modeWrite);
CHAR buff[];
memset(buff, , );
testFile.Write(buff, );
testFile.Seek( * , CFile::begin);
memset(buff, , );
testFile.Write(buff, );
testFile.Seek( * , CFile::begin);
memset(buff, , );
testFile.Write(buff, );
testFile.Close();
return ;
}

  用Sublime Text2打开,可以发现中间两部分是NULL(0),这就是文件空洞

  从代码地图上可以看到此文件有3KB是空的:

  

  Windows下的NTFS文件系统还支持文件空洞的压缩,那些0都是无用的数据,却又占据了空间资源,NTFS文件空洞的压缩算法可以释放这些0字节的空间。这种文件被称为稀疏文件,通过指定DeviceIoControl函数

BOOL WINAPI DeviceIoControl(
_In_ HANDLE hDevice,
_In_ DWORD dwIoControlCode,
_In_opt_ LPVOID lpInBuffer,
_In_ DWORD nInBufferSize,
_Out_opt_ LPVOID lpOutBuffer,
_In_ DWORD nOutBufferSize,
_Out_opt_ LPDWORD lpBytesReturned,
_Inout_opt_ LPOVERLAPPED lpOverlapped
);

设置FSCTL_SET_SPARSE标记可以产生稀疏文件,以下代码是一个例子:

    hFile = CreateFile("tmp_file", GENERIC_WRITE|GENERIC_READ, FILE_SHARE_READ|FILE_SHARE_WRITE,NULL, CREATE_ALWAYS,,NULL);
DWORD dwTemp;
DeviceIoControl(hFile,FSCTL_SET_SPARSE, NULL,,NULL,,&dwTemp,NULL); SetFilePointer(hFile, 0x100000, NULL, FILE_BEGIN);
WriteFile(hFile,"", , &nWritten, NULL);
SetEndOfFile(hFile);
CloseHandle(hFile);

通过GetFileInformationByHandle可以查看文件是否为稀疏文件:

BOOL WINAPI GetFileInformationByHandle(
_In_ HANDLE hFile,
_Out_ LPBY_HANDLE_FILE_INFORMATION lpFileInformation
);

FSCTL_SET_SPARSE

lseek函数与文件空洞的更多相关文章

  1. Linux C ftruncate 函数清空文件注意事项(要使用 lseek 重置偏移量)

    转载:http://blog.csdn.net/a_ran/article/details/43562429 int truncate(const char *path, off_t length); ...

  2. lseek函数

    所有打开的文件都有一个当前文件偏移量(current file offset),以下简称为 cfo.cfo 通常是一个非负整数,用于表明文件开始处到文件当前位置的字节数.读写操作通常开始于 cfo,并 ...

  3. 《UNIX环境高级编程》笔记--read函数,write函数,lseek函数

    1.read函数 调用read函数从文件去读数据,函数定义如下: #include <unistd.h> ssize_t read(int filedes, void* buff, siz ...

  4. APUE学习笔记(2):lseek()练习与文件洞

    对于lseek函数早在大一的C语言课上就有接触,但是几乎没有使用过,只记得是和文件偏移操作相关的 看了APUE上的示例,又使用od工具查看了内容,果然很神奇,很新鲜 figure3.2.c [c] # ...

  5. 在系统中使用read函数读取文件内容

    read函数(读取文件) read函数可以读取文件.读取文件指从某一个已打开地文件中,读取一定数量地字符,然后将这些读取的字符放入某一个预存的缓冲区内,供以后使用. 使用格式如下: number = ...

  6. Unix系统编程()文件空洞

    如果程序的文件偏移量已然跨越了文件结尾,然后再执行IO操作,将会发生什么情况? read调用将会返回0,表示文件结尾.令人惊讶的是,write函数可以在文件结尾后的任意位置写入数据. 从文件结尾后到新 ...

  7. 第五篇:使用无缓冲IO函数读写文件

    前言 本文介绍使用无缓冲IO函数进行文件读写. 所谓的无缓冲是指该IO函数通过调用系统调用实现,其实系统调用内部的读写实现也是使用了缓冲技术的. 读写步骤 1. 打开文件 open 函数 2. 读写文 ...

  8. 使用无缓冲IO函数读写文件

    前言 本文介绍使用无缓冲IO函数进行文件读写. 所谓的无缓冲是指该IO函数通过调用系统调用实现,其实系统调用内部的读写实现也是使用了缓冲技术的. 读写步骤 1. 打开文件 open 函数 2. 读写文 ...

  9. zend studio中ctrl+鼠标左键无法转到类或函数定义文件的解决方法

    转载自:http://blog.csdn.net/wide288/article/details/21622183 zend studio中ctrl+鼠标左键无法转到类或函数定义文件的解决方法: ze ...

随机推荐

  1. MongoDB索引原理

    转自:http://www.mongoing.com/archives/2797 为什么需要索引? 当你抱怨MongoDB集合查询效率低的时候,可能你就需要考虑使用索引了,为了方便后续介绍,先科普下M ...

  2. 深入浅出 妙用Javascript中apply、call、bind【转】

    网上文章虽多,大多复制粘贴,且晦涩难懂,我希望能够通过这篇文章,能够清晰的提升对apply.call.bind的认识,并且列出一些它们的妙用加深记忆. apply.call 在 javascript ...

  3. 【iOS】UIWebView HTML5 扩展

    对于不少iOS开发人员来说,HTML5的内容比較陌生. 尤其是UIWebView类的 stringByEvaluatingJavaScriptFromString 方法 让非常多人认为又得学一种新的语 ...

  4. Javascript玩转继承(三)

    在前两篇文章中,介绍了构造继承和原型继承.今天把剩下的两种写完,这两种的应用相对于前两种来说应用很少,因此称为是非主流继承方式. 首先,来看非主流继承一:实例继承法.我也不说那么多废话了,既然是非主流 ...

  5. 本地CS的导出xls代码段

    用到之前发的NPOI的那个工具类库 //导出private void btnExport_Click(object sender, EventArgs e){saveFileDialog1.ShowD ...

  6. 深度学习FPGA实现基础知识10(Deep Learning(深度学习)卷积神经网络(Convolutional Neural Network,CNN))

    需求说明:深度学习FPGA实现知识储备 来自:http://blog.csdn.net/stdcoutzyx/article/details/41596663 说明:图文并茂,言简意赅. 自今年七月份 ...

  7. STL_算法_查找算法(lower_bound、upper_bound、equal_range)

    C++ Primer 学习中. .. 简单记录下我的学习过程 (代码为主) //全部容器适用(O(log(n)))    已序区间查找算法 lower_bound()        //找第一个符合的 ...

  8. $.cookie is not a function;原因及解决办法

    一.没有引入jQuery库文件 二.jQuery库文件和jquery.cookie.js文件的顺序问题.须先引入jQuery库文件再引入cookie插件文件 三.页面的加载顺序所导致 大家的问题大多出 ...

  9. AngularJS 初始化加载流程

    一.AngularJS 初始化加载流程 1.浏览器载入HTML,然后把它解析成DOM.2.浏览器载入angular.js脚本.3.AngularJS等到DOMContentLoaded事件触发.4.A ...

  10. jquery input切换编辑和不可编辑模式,input自动获得焦点,遍历所有的子类标签

    input切换编辑和不可编辑模式 在项目中我们经常会用到这样的效果,点击一下不可编辑的input 标签,变成可编辑的input标签.用法如下 <input type="text&quo ...