Stream.CopyTo() 不复制一定长度以下的数据
Stream.CopyTo() does not copy data under a certain length
我目前正在开发一个 Windows 商店应用程序,我必须在其中拍照,将其保存在本地,然后在调用同步时将其发送到将照片保存在服务器上的服务.
我在复制这些图片时遇到问题。我所做的是以下内容:
获取指定文件夹中所有图像的列表,并将它们的 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
然后我将它发送到我的 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
除非图片尺寸变小到一定程度,否则这段代码对我有用。我注意到当我的 ByteArray
的 lenght
约为 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
块应该用于任何地方:
- 创建一个实现
IDisposable
接口的 class 对象,并且
- 您在同一范围内开始和结束使用该对象
Using
确保调用 IDisposable
接口的 Dispose
方法,即使抛出异常也是如此。
在这种情况下,Dispose
方法将确保在关闭流之前刷新所有缓冲区。我怀疑最后 4000 个字节没有被刷新。事实上,我怀疑您最终会注意到大于 4000 字节的图像存在奇怪的问题——其中一些图像可能会丢失装满数据的最终缓冲区。没有足够的数据阻止它们显示,但至少可以说它们看起来很奇怪。
我目前正在开发一个 Windows 商店应用程序,我必须在其中拍照,将其保存在本地,然后在调用同步时将其发送到将照片保存在服务器上的服务.
我在复制这些图片时遇到问题。我所做的是以下内容:
获取指定文件夹中所有图像的列表,并将它们的
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
然后我将它发送到我的 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
除非图片尺寸变小到一定程度,否则这段代码对我有用。我注意到当我的 ByteArray
的 lenght
约为 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
块应该用于任何地方:
- 创建一个实现
IDisposable
接口的 class 对象,并且 - 您在同一范围内开始和结束使用该对象
Using
确保调用 IDisposable
接口的 Dispose
方法,即使抛出异常也是如此。
在这种情况下,Dispose
方法将确保在关闭流之前刷新所有缓冲区。我怀疑最后 4000 个字节没有被刷新。事实上,我怀疑您最终会注意到大于 4000 字节的图像存在奇怪的问题——其中一些图像可能会丢失装满数据的最终缓冲区。没有足够的数据阻止它们显示,但至少可以说它们看起来很奇怪。