VB.NET合并大文件

时间:2013-01-28 16:39:21

标签: vb.net merge

我希望使用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()

2 个答案:

答案 0 :(得分:3)

不,您无法在不打开任何文件的情况下合并文件。您将需要以打开它们'在某种程度上,为了访问数据,无论是通过使用System.IO提供的框架功能,还是通过使用本机API读取光盘扇区,您仍然需要打开& #39; /读取数据。

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

所以,..

  • 定义缓冲区(new Byte(4096)
  • 打开一个新的空文件(Using ... new System.IO.File.Open(...)
  • 为每个要加入的文件...
    • 打开该文件(Using ... new System.IO.File.Open(...)
    • 循环使用Read的{​​{1}}方法按顺序填充缓冲区,直到它返回FileStream
    • 使用<= 0&#39; Filestream将缓冲区内容写入新文件。

答案 1 :(得分:0)

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

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

    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

可以通过编辑&#34; catch&#34;来增强此代码。如果他们仍然打开,关闭流。留作练习: - )