想实现创建一个指定大小的空文件,但这个文件不占用磁盘空间

charilia 2018-10-09 07:18:09
我想实现创建一个指定大小的空文件,但又不想让其占用磁盘空间。我原先尝试用CreateFileMapping、SetFilePoint去创建1G的空文件,文件是创建出来了,但是磁盘空间被占用了1G。
我想实现的效果有些软件已经实现了,比如下图,文件看起来是有大小的,但实际内容是空的,且用dos命令查询文件也是空的(即不占用磁盘空间)。不知道有什么方案可以实现这样的效果?
...全文
549 5 打赏 收藏 转发到动态 举报
写回复
用AI写文章
5 条回复
切换为时间正序
请发表友善的回复…
发表回复
zwfgdlc 2018-10-10
  • 打赏
  • 举报
回复

LARGE_INTEGER FileSize;
FileSize.QuadPart = 1024 * 1024 * 1024; //创建一个1GB的文件

CreateSparseFile(L"f:\\1.dat", FileSize);

BOOL CreateSparseFile(TCHAR* pFileName, LARGE_INTEGER Size)
{
	HANDLE hFile;

	hFile = CreateFile(pFileName, GENERIC_WRITE | GENERIC_READ, FILE_SHARE_READ, NULL, CREATE_ALWAYS, FILE_ATTRIBUTE_NORMAL, NULL);
	if (hFile == INVALID_HANDLE_VALUE)
	{
		return FALSE;
	}
	
	DWORD dwReturn;     
	DeviceIoControl(hFile, FSCTL_SET_SPARSE, NULL, 0, NULL, 0, &dwReturn, NULL);
	SetFilePointerEx(hFile, Size, NULL, FILE_BEGIN);
	SetEndOfFile(hFile);
	CloseHandle(hFile);
	return TRUE;
}
赵4老师 2018-10-10
  • 打赏
  • 举报
回复
弄个RamDIsk
charilia 2018-10-10
  • 打赏
  • 举报
回复
尝试了SetFileInformationByHandle,好像也不行。
SetFileValidData的话,还有权限的问题。看了msdn介绍,应该也无法实现这样的效果。
charilia 2018-10-10
  • 打赏
  • 举报
回复
结贴了,我的需求是预留空文件作为下载介质的同时,又不占用磁盘空间。下载完成后,才占用磁盘大小,且长期存储。
RamDisk的方式不适用我的需求。
赵4老师 2018-10-10
  • 打赏
  • 举报
回复
弄个带压缩选项的RamDisk才是楼主所求。
charilia 2018-10-10
  • 打赏
  • 举报
回复
引用 2 楼 zhao4zhong1 的回复:
弄个RamDIsk

感谢赵四老师光临
charilia 2018-10-10
  • 打赏
  • 举报
回复
引用 3 楼 zwfgdlc 的回复:

LARGE_INTEGER FileSize;
FileSize.QuadPart = 1024 * 1024 * 1024; //创建一个1GB的文件

CreateSparseFile(L"f:\\1.dat", FileSize);

BOOL CreateSparseFile(TCHAR* pFileName, LARGE_INTEGER Size)
{
HANDLE hFile;

hFile = CreateFile(pFileName, GENERIC_WRITE | GENERIC_READ, FILE_SHARE_READ, NULL, CREATE_ALWAYS, FILE_ATTRIBUTE_NORMAL, NULL);
if (hFile == INVALID_HANDLE_VALUE)
{
return FALSE;
}

DWORD dwReturn;
DeviceIoControl(hFile, FSCTL_SET_SPARSE, NULL, 0, NULL, 0, &dwReturn, NULL);
SetFilePointerEx(hFile, Size, NULL, FILE_BEGIN);
SetEndOfFile(hFile);
CloseHandle(hFile);
return TRUE;
}


稀疏文件的方式,的确可行。但是只有在支持稀疏文件的磁盘格式下才有效,比如NTFS。而在FAT32这类不支持压缩的格式下,不免有些徒劳。

3,881

社区成员

发帖
与我相关
我的任务
社区描述
C/C++ 其它技术问题
社区管理员
  • 其它技术问题社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧