Stream.CopyTo()不会复制特定长度的数据

时间:2015-05-04 13:30:21

标签: .net vb.net web-services stream file-transfer

我目前正在开发一个Windows应用程序,我必须在其中拍照,在本地保存,然后在调用同步时将其发送到将服务器上保存图片的服务。

我在复制这些图片时遇到问题。我的工作如下:

  1. 获取指定文件夹中所有图片的列表,并将他们的buffer.toarray提取到bitearray

    Dim fileList As IReadOnlyList(Of StorageFile) = Await folder.GetFilesAsync()
    For Each file As StorageFile In fileList
    
        Dim Buffer As IBuffer = Await Windows.Storage.FileIO.ReadBufferAsync(file)
        fileBytes = Buffer.ToArray()
        lstfileBytes.Add(fileBytes)
    
    Next file
    
  2. 然后我将它发送到我的VB.Net服务,该服务将图像保存到使用stream.copyto()

    创建的文件中
    For i = 0 To lstMemoryPicturesReservoir.Count - 1
        Dim fs As FileStream = New FileStream("\\SERVER\Data\name.jpg", FileMode.Create)
        Dim memory As Stream = New MemoryStream(lstMemoryPicturesReservoir(i))
        memory.position = 0
        memory.CopyTo(fs)
    Next
    
  3. 此代码适用于我,除非图片尺寸变小到某一点。我注意到,当lenght的{​​{1}}在 4000或更低附近时,图片无法正常复制。当我在 Windows Photo Viewer 中打开它时,出现以下错误:

      

    Windows照片查看器无法显示此图片,因为文件是   空

    有什么可能导致此问题或如何修复它的想法?

1 个答案:

答案 0 :(得分:1)

尝试将两个流放入Using块:

For i = 0 To lstMemoryPicturesReservoir.Count - 1
    Using fs As FileStream = New FileStream("\\SERVER\Data\name.jpg", FileMode.Create)
        Using memory As Stream = New MemoryStream(lstMemoryPicturesReservoir(i))
            memory.position = 0
            memory.CopyTo(fs)
        End Using
    End Using
Next
无论你在哪里都应该使用

Using块:

  1. 创建实现IDisposable接口和
  2. 的类的对象
  3. 您在同一范围内开始和结束使用该对象
  4. Using确保调用Dispose接口的IDisposable方法,即使抛出异常也是如此。

    在这种情况下,Dispose方法将确保在关闭流之前刷新所有缓冲区。我怀疑最后4000个字节没有被刷新。事实上,我怀疑你最终会注意到大于4000字节的图像的奇怪问题 - 其中一些会错过最终缓冲区的数据。没有足够的数据来阻止它们显示,但至少可以说它们看起来很奇怪。