c# .net 使用stream 的copyto 方法无效?
MemoryStreamms=newMemoryStream();varimg=GetImage.GetWindowCapture(hwnd,carPoint,addre...
MemoryStream ms = new MemoryStream();
var img = GetImage.GetWindowCapture(hwnd, carPoint, addressPoint);
img.Save(ms, ImageFormat.Tiff);
using (FileStream fs = new FileStream(carFold + "car0.tif", FileMode.Create, FileAccess.Write))
{
ms.CopyTo(fs);
fs.Flush();
}
ms.Dispose();
这里使用copyto 保存的文件0k,但是如果将ms转换为字节数组,然后写入fs 保存文件就正常,求教哪里出了问题? 展开
var img = GetImage.GetWindowCapture(hwnd, carPoint, addressPoint);
img.Save(ms, ImageFormat.Tiff);
using (FileStream fs = new FileStream(carFold + "car0.tif", FileMode.Create, FileAccess.Write))
{
ms.CopyTo(fs);
fs.Flush();
}
ms.Dispose();
这里使用copyto 保存的文件0k,但是如果将ms转换为字节数组,然后写入fs 保存文件就正常,求教哪里出了问题? 展开
4个回答
展开全部
首先:Stream.CopyTo要dotNet4.0以上才有。
当对文件操作,写入和复制时,你需要创建一个byte[]类型的buffer(因为涉及和磁盘交互)。你转换为数组就是相当于一个buffer. MemoryStream 实质上一个无法改变大小的字节数组的实例,这样造就了不能做为缓冲区使用,因而无法直接写入文件。【查看MSDN】
你可以重写CopyTo方法,达到你想要的结果。
实例代码如下:
public void CopyTo(Stream destination)
{
// 缓冲区默认大小
this.InternalCopyTo(destination, 81920);
}
private void InternalCopyTo(Stream destination, int bufferSize)
{
byte[] array = new byte[bufferSize];
int count;
while ((count = this.Read(array, 0, array.Length)) != 0)
{
destination.Write(array, 0, count);
}
}
更多追问追答
追问
可能是您说的原理吧,请问哪些流 可做为缓冲区使用,哪些流不可以呢?
追答
能作为缓冲区使用的就是btye[]了。流是分配好大小的byte[]
展开全部
Stream.CopyTo是复制“流的当前位置到流结尾的字节”到目标流,且不会重设当前位置。
注意什么叫“当前位置”。流被使用后“当前位置”就会发生改变。
如果你需要把某个流的所有字节都复制,你需要先重设流的当前位置为起始位置然后再CopyTo。
“且不会重设当前位置”的意思是:当你完成调用某个流的CopyTo之后,流的当前位置就是流的结尾,不会自动重设到起始位置或某处。若你想再次复制该流的所有字节到另一个流,你就需要再次重设流的当前位置到起始位置。
用“Stream.Position = 0;”重设当前位置到起始位置。
注意什么叫“当前位置”。流被使用后“当前位置”就会发生改变。
如果你需要把某个流的所有字节都复制,你需要先重设流的当前位置为起始位置然后再CopyTo。
“且不会重设当前位置”的意思是:当你完成调用某个流的CopyTo之后,流的当前位置就是流的结尾,不会自动重设到起始位置或某处。若你想再次复制该流的所有字节到另一个流,你就需要再次重设流的当前位置到起始位置。
用“Stream.Position = 0;”重设当前位置到起始位置。
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
展开全部
ms.CopyTo(fs); //参数你看看 试试其他重载方法(长度 起始位置)。
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
展开全部
FileStream.CopyTo(MemoryStream) ok
MemoryStream.CopyTo(FileStream) false
看了官方的例子,结论如上
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
推荐律师服务:
若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询