我有一些代码使用FileStream,StreamWriter和XmlDocument来生成与Excel兼容的输出文件。非常有用!
但是我现在需要制作文件的副本,我想在内存中这样做。所以我拿了原始的FileStream代码并将FileStream更改为MemoryStream,然后将其包装在这个函数中:
'----------------------------------------------------------------------------------
Friend Sub Save(Optional ByVal SaveCalculatedResults As Boolean = True)
Dim MStream As MemoryStream
Dim FStream As FileStream
Dim Bytes As Byte()
'make the stream containing the XML
MStream = ToXLSL(SaveCalculatedResults)
If MStream.Length = 0 Then Return
'then read that data into a byte buffer
ReDim Bytes(CInt(MStream.Length))
MStream.Read(Bytes, 0, CInt(MStream.Length))
'and then write it to "us"
FStream = New FileStream("C:\OUTFILE.XLSX", FileMode.Create)
FStream.Write(Bytes, 0, CInt(MStream.Length))
FStream.Flush()
End Sub
这会在正确的位置创建一个文件,它具有与之前完全相同的长度,但在Excel中打开它会导致文件格式无效的错误。
任何人都可以在该代码中看到任何明显的问题吗?也许我正在向后写字节?这可能是文本编码问题吗? 32/64问题?
P.S。我尝试过使用CopyTo,但这似乎不适用于VB?
答案 0 :(得分:2)
它需要猜测ToXLSL()的作用,但行为给出了强烈的提示:MemoryStream的位置位于流的末尾。所以Read()调用实际上并没有读取任何东西。通过检查其返回值进行验证。
完全摆脱Bytes(),复制像这样的数据是非常浪费的。您不需要它,MemoryStream已经允许您访问数据:
Using FStream = New FileStream("C:\OUTFILE.XLSX", FileMode.Create)
FStream.Write(MStream.GetBuffer(), 0, CInt(MStream.Length))
End Using
请注意使用语句不是可选的。并且你不能写C:\