【问题标题】:VB.NET merge large filesVB.NET 合并大文件
【发布时间】:2013-01-28 16:39:21
【问题描述】:

我希望使用 VB.NET 来替换合并大文件的批处理文件。这是因为批处理文件只是在作为计划作业运行时挂起。 (批处理文件在其他任何地方都可以正常工作;但不能作为 SQL 作业。)

批处理文件执行了以下步骤: 复制“\server\network location\large_file1.txt”+“\server\network location\large_file2.txt”+“\server\network location\large_file3.txt”

这些文件很大,我不想打开任何一个。我认为运行该作业的服务器可能内存不足。

这可以在 VB.NET 中完成吗?

谢谢!

更新:来自用户评论的解决方案:

Dim myBuffer(4096) As Byte 
Dim fsdest As System.IO.FileStream 
Dim fsSecondFile As System.IO.FileStream fsdest = New System.IO.FileStream(strDestinationfile, System.IO.FileMode.Append) 

fsSecondFile = New System.IO.FileStream(strSecondFile, IO.FileMode.Open, IO.FileAccess.Read) 

Do While fsSecondFile.Read(myBuffer, 0, myBuffer.Length) > 0 
    fsdest.Write(myBuffer, 0, 4095) 
Loop 

fsdesc.close() 
fsSecondFile.close()

【问题讨论】:

  • 如果其他用户的回答有帮助,请考虑将其标记为已接受。

标签: vb.net merge


【解决方案1】:

不,您不能在不打开任何文件的情况下合并文件。您将需要在某个级别“打开它们”以访问数据,无论是通过使用 System.IO 提供的框架功能,还是通过使用本机 API 读取光盘扇区,您仍然需要“打开”/读取数据。

解决方案是打开文件,是的,但是 using streamsbuffers 这样您就可以进行一些内存管理,而不仅仅是通过“全部读取”调用来使系统膨胀。

所以,..

  • 定义缓冲区 (new Byte(4096))
  • 打开一个新的空文件 (Using ... new System.IO.File.Open(...))
  • 对于每个要加入的文件...
    • 打开该文件 (Using ... new System.IO.File.Open(...))
    • 循环使用FileStreamRead方法依次填充缓冲区,直到它返回<= 0
    • 使用FilestreamWrite将缓冲区内容写入新文件。

【讨论】:

  • 您好,格兰特,感谢您的回复。我让它工作。我的代码如下所示: Dim myBuffer(4096) As Byte Dim fsdest As System.IO.FileStream Dim fsSecondFile As System.IO.FileStream fsdest = New System.IO.FileStream(strDestinationfile, System.IO.FileMode.Append) fsSecondFile = New System.IO.FileStream(strSecondFile, IO.FileMode.Open, IO.FileAccess.Read) Do While fsSecondFile.Read(myBuffer, 0, myBuffer.Length) > 0 fsdest.Write(myBuffer, 0, 4095) 循环 fsdesc。关闭() fsSecondFile.close()
【解决方案2】:

我一直在寻找这样的东西。但是,原始消息中提出的解决方案无法正常工作(它会损坏生成的文件)。

我更正了代码,并将其发布在这里,以防有人需要。另外我的代码有点不同,它没有修改第一个文件,而是创建了第三个文件。

    Public Function JoinFiles(strFile1 As String, strFile2 As String, fileOutPath As String) As Boolean
    Dim myBuffer(4096) As Byte
    Dim fsdest As System.IO.FileStream
    Dim fsFirstFile, fsSecondFile As System.IO.FileStream
    Dim BytesToRead As Integer = 0
    Dim n As Integer

    Try
        fsdest = New System.IO.FileStream(fileOutPath, System.IO.FileMode.Append)

        fsFirstFile = New System.IO.FileStream(strFile1, IO.FileMode.Open, IO.FileAccess.Read)

        BytesToRead = CType(fsFirstFile.Length, Integer)

        While (BytesToRead > 0)
            n = fsFirstFile.Read(myBuffer, 0, myBuffer.Length)
            If n = 0 Then Exit While
            fsdest.Write(myBuffer, 0, n)
            BytesToRead = BytesToRead - n
        End While
        fsFirstFile.Close()


        fsSecondFile = New System.IO.FileStream(strFile2, IO.FileMode.Open, IO.FileAccess.Read)

        BytesToRead = CType(fsSecondFile.Length, Integer)

        While (BytesToRead > 0)
            n = fsSecondFile.Read(myBuffer, 0, myBuffer.Length)
            If n = 0 Then Exit While
            fsdest.Write(myBuffer, 0, n)
            BytesToRead = BytesToRead - n
        End While
        fsSecondFile.Close()

        fsdest.Close()

        Return True
    Catch ex As Exception
        Return False
    End Try
End Function

可以通过编辑“catch”来增强此代码,以在流仍处于打开状态时将其关闭。留作练习:-)

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2020-07-20
    • 1970-01-01
    • 2021-05-04
    • 2015-05-11
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多