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

.net Stream.CopyTo()不复制特定长度下的数据,.net,vb.net,web-services,stream,file-transfer,.net,Vb.net,Web Services,Stream,File Transfer,我目前正在开发一个Windows应用商店应用程序,在该应用程序中,我必须拍摄一张照片,将其保存在本地,然后在调用同步时将其发送到将照片保存在服务器上的服务 我在复制这些图片时遇到问题。我所做的是: 获取指定文件夹中所有图像的列表,并将其缓冲区.toarray提取到BitArray Dim fileList As IReadOnlyList(Of StorageFile) = Await folder.GetFilesAsync() For Each file As StorageFile In

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

我在复制这些图片时遇到问题。我所做的是:

  • 获取指定文件夹中所有图像的列表,并将其
    缓冲区.toarray
    提取到
    BitArray

    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
    
  • 然后我将其发送到我的VB.Net服务,该服务将图像保存到它使用
    stream.copyto()

  • 此代码适用于我,除非图片大小变小到某一点。我注意到,当我的
    ByteArray
    长度
    大约4000或更低时,图片复制不正确。当我在Windows照片查看器中打开它时,出现以下错误:

    Windows照片查看器无法显示此图片,因为文件已被删除 空的


    知道是什么导致了这个问题,或者如何解决它吗?

    尝试使用
    块将两个流放入

    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
    
    使用
    块应在以下位置使用:

  • 创建实现
    IDisposable
    接口的类的对象,以及
  • 在同一范围内开始和结束使用该对象
  • 使用
    确保调用
    IDisposable
    接口的
    Dispose
    方法,即使引发异常


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

    是的,它可以工作。我不太明白使用
    会有什么不同,因为我已经读过这本书,它让我明白了,所以,帮助一个老家伙。“nvm”是什么意思?“没关系”?是的,这正是它的意思,汉克斯。今天学到了一些新东西。
    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