zoukankan      html  css  js  c++  java
  • 在.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: est.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当时的实际负载有关)

  • 相关阅读:
    【转】Wrapper配置详解及高级应用
    【转】Eclipse4.4.1安装velocity插件Veloeclipse.ui_2.0.8
    【转】创建SVN仓库的步骤
    【转】Hibernate 常见异常
    [转]Java中Map的用法详解
    [转]CocoaPods安装和使用教程
    [转]struts1.2的action参数配置
    [转]hibernateTools工具安装及使用总结(eclipse 3.6)
    [转]iOS开发中@property的属性weak nonatomic strong readonly等介绍
    [转]使用 Xcode 5 和 Interface Builder创建 Hello World App
  • 原文地址:https://www.cnblogs.com/pangblog/p/3278002.html
Copyright © 2011-2022 走看看