2

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

2 回答 2

3

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

解决方案是打开文件,是的,但是使用流缓冲区,以便您进行一些内存管理,而不仅仅是通过“全部读取”调用使系统膨胀。

所以,..

  • 定义一个缓冲区 ( new Byte(4096))
  • 打开一个新的空文件 ( Using ... new System.IO.File.Open(...))
  • 对于每个要加入的文件...
    • 打开那个文件 ( Using ... new System.IO.File.Open(...))
    • 循环使用 的Read方法FileStream依次填充缓冲区,直到它返回<= 0
    • Filestream使用's将缓冲区内容写入新文件Write
于 2013-01-28T16:42:25.810 回答
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

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

于 2015-10-02T10:33:33.020 回答