我希望使用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()
答案 0 :(得分:3)
不,您无法在不打开任何文件的情况下合并文件。您将需要以打开它们'在某种程度上,为了访问数据,无论是通过使用System.IO提供的框架功能,还是通过使用本机API读取光盘扇区,您仍然需要打开& #39; /读取数据。
解决方案是打开文件,是的,但是using streams和buffers,这样您就可以进行一些内存管理,而不仅仅是通过“读取”来膨胀系统所有'调用
所以,..
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;来增强此代码。如果他们仍然打开,关闭流。留作练习: - )