Stream.CopyTo() 不复制一定长度以下的数据

Stream.CopyTo() does not copy data under a certain length

我目前正在开发一个 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
    

除非图片尺寸变小到一定程度,否则这段代码对我有用。我注意到当我的 ByteArraylenght 约为 4000 或更低 时,图片无法正确复制。当我在 Windows 照片查看器 中打开它时,出现以下错误:

Windows Photo Viewer can't display this picture because the file is empty

是否知道可能导致此问题的原因或如何解决?

尝试将两个流放入 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 接口的 class 对象,并且
  2. 您在同一范围内开始和结束使用该对象

Using 确保调用 IDisposable 接口的 Dispose 方法,即使抛出异常也是如此。

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