请问如何创建占用空间小的超大文件?

流水之风 2008-01-23 09:47:15
我发现使用锐起无盘软件生成无盘所使用的IMG文件很奇特,其文件的大小可以是非常大的(最大320G),但是占用空间却很小(在文件属性那里看的),总体来说就是在锐起中创建IMG文件时输入的镜象包有多大,那么创建出来的文件的大小就有多大(最大320G),但是其占用空间其实仅仅是实际使用的大小,不过在将该IMG文件拷贝到其他位置时实际也会拷贝与该文件大小相同容量的文件数据。不知道有什么办法自己也创建这样的文件?能够占用空间小,但是显示出来的文件大小却非常大。

由于上传图片时总是提示无法打开文件,所以图片办法提供了。
...全文
410 13 打赏 收藏 转发到动态 举报
AI 作业
写回复
用AI写文章
13 条回复
切换为时间正序
请发表友善的回复…
发表回复
流水之风 2008-01-24
  • 打赏
  • 举报
回复
回Sandrer :
WINRAR的压缩包和虚拟光驱的镜像我知道怎么修改,也知道RAR压缩包压缩数据为0的文件时可以达到这种效果,不过我所需要的不是这种,我所指的是稀疏文件,原理和RAR的压缩也差不多,但是用途不一样。
流水之风 2008-01-24
  • 打赏
  • 举报
回复
嗯,摸索了一下,将程序转到VB6中终于可以正常使用了,十分感谢~
Sandrer 2008-01-24
  • 打赏
  • 举报
回复
某些镜像文件是可以被压缩的!
当被虚拟光驱加载的时候,虚拟光驱会自动分析文件头,把实际大小和文件列表给读出来!
就像WinRAR一样,RAR文件就是镜像,你平时看它的时候,是很小
但是用WinRAR打开后,你就可以看到它的真实尺寸。
cnzdgs 2008-01-24
  • 打赏
  • 举报
回复
我贴的代码用2005编译测试过了,没问题,就是不确定VB6能否直接用。
调用CreateSparseFile函数创建出来一个稀疏文件,然后就可以用VB的方法打开这个文件来使用了。假设要做1G的假数据,打开文件后先Seek到1G的位置,然后再写就可以了。
注意:要在NTFS分区上创建文件,FAT类型分区没有稀疏文件概念。
流水之风 2008-01-24
  • 打赏
  • 举报
回复
我已经知道怎么调用了,但是调用CreateSparseFile函数后所创建出来的文件是个空白文件,零字节的,希望您能够在代码中将数据写入文件(全0的数据)。另外说一下,使用fsutil命令创建稀疏文件要先创建全零的空白文件(此时要设置好所需的容量,但是此时也已经占用了空间,因此无法创建出超过所在分区的空白文件大小),然后再设置该文件为稀疏文件,接着设置稀疏范围,这样才能使这个文件成为占用空间小,但文件大小很大的稀疏文件,不过这样也有缺点,就是这样创建文件会导致所在分区的剩余空间显示错误,必须扫描一次磁盘才行,但是使用锐起无盘所创建出来的稀疏文件并没有影响显示所在分区的剩余容量,而且创建时也可以随便创建出大于所在分区剩余容量的稀疏文件。
流水之风 2008-01-24
  • 打赏
  • 举报
回复
回cnzdgs:
十分感谢您回复了我的帖子,但是由于我还是使用VB6.0的,所以VB2005还不是很熟悉,并且这个代码在VB2005上还不能直接运行吧?我试了一下,调试CreateSparseFile时出现了错误,不过大概是我还不怎么会用这个,所以希望您能够帮帮忙,把代码写完好吗?只要能够在运行后直接在D盘或者其它盘中创建一个稀疏文件就行了。谢谢~
cike_1111 2008-01-24
  • 打赏
  • 举报
回复
有没有考虑过 硬盘的格式??

fat32
ntsf
cnzdgs 2008-01-24
  • 打赏
  • 举报
回复
稀疏文件之前听说过,建立文件后执行一个DeviceIoControl,好象是IOCTL_SET_SPARSE,然后向后调文件指针就行了。今天太晚了,明天试试。
cnzdgs 2008-01-24
  • 打赏
  • 举报
回复
我试过了,用以下代码在NTFS分区上创建文件,文件即具有稀疏属性。之后打开文件向后调文件指针再写数据即可达到这种效果。我用2005写的。
Public Class FileApi
Public Const INVALID_HANDLE_VALUE As Integer = -1

Public Enum DesiredAccess As UInt32
GENERIC_READ = &H80000000L
GENERIC_WRITE = &H40000000L
GENERIC_EXECUTE = &H20000000L
GENERIC_ALL = &H10000000L
End Enum

Public Enum ShareMode As UInt32
READ = 1
WRITE = 2
DELETE = 4
ALL = 7
End Enum

Public Enum CreationDisposition As UInt32
CREATE_NEW = 1
CREATE_ALWAYS = 2
OPEN_EXISTING = 3
OPEN_ALWAYS = 4
TRUNCATE_EXISTING = 5
End Enum

Public Enum FileAttribute
READ_ONLY = &H1
HIDDEN = &H2
SYSTEM = &H4
DIRECTORY = &H10
ARCHIVE = &H20
DEVICE = &H40
NORMAL = &H80
TEMPORARY = &H100
SPARSE_FILE = &H200
REPARSE_POINT = &H400
COMPRESSED = &H800
OFFLINE = &H1000
NOT_CONTENT_INDEXED = &H2000
ENCRYPTED = &H4000
End Enum

Public Structure SECURITY_ATTRIBUTES
Public Length As UInt32
Public SecurityDescriptor As Integer
Public bInheritHandle As Boolean
End Structure

Public Structure OVERLAPPED
Public Internal As Integer
Public InternalHigh As Integer
Public Offset As UInt32
Public OffsetHigh As UInt32
Public EventHandle As Integer
End Structure

Public Declare Auto Function CreateFile Lib "Kernel32.dll" (ByVal FileName As String, ByVal DesiredAccess As UInt32, ByVal ShareMode As UInt32, ByRef SecurityAttributes As SECURITY_ATTRIBUTES, ByVal CreationDisposition As UInt32, ByVal FlagsAndAttributes As UInt32, ByVal TemplateFile As Integer) As Integer
Public Declare Auto Function DeviceIoControl Lib "Kernel32.dll" (ByVal Handle As Integer, ByVal IoControlCode As UInt32, ByVal InBuffer() As Byte, ByVal InBufferSize As UInt32, ByVal OutBuffer() As Byte, ByVal OutBufferSize As UInt32, ByRef BytesReturned As UInt32, ByRef Overlapped As OVERLAPPED) As Boolean
Public Declare Auto Function WriteFile Lib "Kernel32.dll" (ByVal Handle As Integer, ByVal Bytes() As Byte, ByVal NumberOfBytesToWrite As UInt32, ByRef NumberOfBytesWritten As UInt32, ByVal Overlapped As OVERLAPPED) As Boolean
Public Declare Auto Function CloseHandle Lib "Kernel32.dll" (ByVal Handle As Integer) As Boolean

Public Shared Function CreateSparseFile(ByVal FileName As String) As Boolean
Dim handle As Integer
Dim bytes As UInt32

CreateSparseFile = False
handle = FileApi.CreateFile(FileName, FileApi.DesiredAccess.GENERIC_ALL, 0, Nothing, FileApi.CreationDisposition.CREATE_NEW, FileApi.FileAttribute.NORMAL, 0)
If handle <> FileApi.INVALID_HANDLE_VALUE Then
CreateSparseFile = FileApi.DeviceIoControl(handle, &H900C4, Nothing, 0, Nothing, 0, bytes, Nothing)
FileApi.CloseHandle(handle)
End If
End Function
End Class

流水之风 2008-01-23
  • 打赏
  • 举报
回复
不是指压缩,系统自带的压缩虽然不错,但是主要是用文件稀疏功能
cnzdgs 2008-01-23
  • 打赏
  • 举报
回复
创建一个压缩属性的文件,里面写大量的0怎样?
流水之风 2008-01-23
  • 打赏
  • 举报
回复
已经了解到可以使用fsutil命令来实现,但是能否不通过调用该命令的情况下达到这个目的?例如API之类的。
m5home 2008-01-23
  • 打赏
  • 举报
回复
帮顶

1,488

社区成员

发帖
与我相关
我的任务
社区描述
VB API
社区管理员
  • API
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

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