在.NET中快速创建一个5GB、10GB或更大的空文件

对于通过UDP进行打文件传输的朋友应该首先会考虑到一个问题,那就是由于UDP并不会根据先来先到原则进行发送,也许你发送端发送的时候是以包1和包2的顺序传输的,但接收端可能以包2和包1 的顺序来进行接收,这就导致了文件的错序而损坏,要避免这个问题就应该现将文件分块,然后在数据包中写入块序号,在接收的时候将对应块映射到文件的对应位置。
这时第二个问题来了,你得先创建一个对应源文件同样大小的文件
如果要快速创建一个5GB甚至更大的20GB或100GB的文件该如何处理呢?


事实上相当的简单(过去我曾经用过通过调用fsutil命令行来快速构建,但很快发现这并不是一个方法),.NET也对此进行了非常好的优化,只需要使用FileStream的Seek指令移动光标到文件大小再写入文件即可。
处于效率的考虑(比如某些计算机反应较慢或硬盘速度较慢)那么还是写在独立的线程或任务中较为合适。
以下是代码(VB版本):


Private FileName As String
Private FileSize As ULong
Private sl As ULong

Private Sub CreateFile()
Dim fs As New IO.FileStream(FileName,IO.FileMode.OpenorCreate)
fs.Seek(FileSize,IO.SeekOrigin.Begin)
fs.WriteByte(0)
fs.Flush()
fs.Close()
MsgBox("文件创建结束!" & vbCrLf & "文件大小:" & FileSize / 1024 / 1024 & "MB" & vbCrLf & "创建时间:" & (My.Computer.Clock.TickCount - sl) / 1000 & "秒")
End Sub


Private Sub Button1_Click(ByVal sender As Object,ByVal e As EventArgs) Handles Button1.Click
Dim fl As ULong
fl = 1024 * 1024 * 1024
fl *= 5

FileName = "D:\test.iso"
FileSize = fl
Dim th As New Threading.Thread(AddressOf CreateFile)
sl = My.Computer.Clock.TickCount
th.Start()

End Sub

经过在Core T6570 /4G /500G 5400RPM的计算机上进行测试,写一个5GB的文件大概需要31毫秒,写一个15GB的文件大概需要171毫秒,写一个90GB的文件需要191毫秒。(写入的时间与cpu当时的实际负载有关)

相关文章

Format[$] ( expr [ , fmt ] ) format 返回变体型 format$ 强...
VB6或者ASP 格式化时间为 MM/dd/yyyy 格式,竟然没有好的办...
在项目中添加如下代码:新建窗口来显示异常信息。 Namespace...
转了这一篇文章,原来一直想用C#做k3的插件开发,vb没有C#用...
Sub 分列() ‘以空格为分隔符,连续空格只算1个。对所选...
  窗体代码 1 Private Sub Text1_OLEDragDrop(Data As Dat...