写入FileStream工作,复制到FileStream的MemoryStream不起作用

时间:2014-04-10 21:28:59

标签: vb.net filestream

我有一些代码使用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?

1 个答案:

答案 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:\