我有一个用流初始化的StreamReader对象,现在我想将这个流保存到磁盘(流可以是.gif、.jpg或.pdf)。
现有代码:
StreamReader sr = new StreamReader(myOtherObject.InputStream);
我需要将其保存到磁盘(我有文件名)。将来我可能希望将其存储到SQL Server。
我还有编码类型,如果我将其存储到SQL Server,我将需要它,对吗?
我有一个用流初始化的StreamReader对象,现在我想将这个流保存到磁盘(流可以是.gif、.jpg或.pdf)。
现有代码:
StreamReader sr = new StreamReader(myOtherObject.InputStream);
我需要将其保存到磁盘(我有文件名)。将来我可能希望将其存储到SQL Server。
我还有编码类型,如果我将其存储到SQL Server,我将需要它,对吗?
当前回答
正如JonSkeet的回答中Tilendor所强调的,自.NET4以来,流具有CopyTo方法。
var fileStream = File.Create("C:\\Path\\To\\File");
myOtherObject.InputStream.Seek(0, SeekOrigin.Begin);
myOtherObject.InputStream.CopyTo(fileStream);
fileStream.Close();
或者使用以下语法:
using (var fileStream = File.Create("C:\\Path\\To\\File"))
{
myOtherObject.InputStream.Seek(0, SeekOrigin.Begin);
myOtherObject.InputStream.CopyTo(fileStream);
}
如果尚未开始,则必须调用Seek,否则无法复制整个流。
其他回答
您不能将StreamReader用于二进制文件(如gifs或jpgs)。StreamReader用于文本数据。如果将其用于任意二进制数据,几乎肯定会丢失数据。(如果您使用Encoding.GetEncoding(28591),您可能会没事,但有什么意义?)
为什么您需要使用StreamReader?为什么不将二进制数据保留为二进制数据,并将其作为二进制数据写回磁盘(或SQL)?
编辑:因为这似乎是人们想要看到的。。。如果您只想将一个流复制到另一个流(例如,复制到文件),请使用以下操作:
/// <summary>
/// Copies the contents of input to output. Doesn't close either stream.
/// </summary>
public static void CopyStream(Stream input, Stream output)
{
byte[] buffer = new byte[8 * 1024];
int len;
while ( (len = input.Read(buffer, 0, buffer.Length)) > 0)
{
output.Write(buffer, 0, len);
}
}
要使用它将流转储到文件,例如:
using (Stream file = File.Create(filename))
{
CopyStream(input, file);
}
请注意,Stream.CopyTo是在.NET4中引入的,其目的基本相同。
正如JonSkeet的回答中Tilendor所强调的,自.NET4以来,流具有CopyTo方法。
var fileStream = File.Create("C:\\Path\\To\\File");
myOtherObject.InputStream.Seek(0, SeekOrigin.Begin);
myOtherObject.InputStream.CopyTo(fileStream);
fileStream.Close();
或者使用以下语法:
using (var fileStream = File.Create("C:\\Path\\To\\File"))
{
myOtherObject.InputStream.Seek(0, SeekOrigin.Begin);
myOtherObject.InputStream.CopyTo(fileStream);
}
如果尚未开始,则必须调用Seek,否则无法复制整个流。
另一个选项是将流设置为byte[]并使用File.WriteAllBytes。这应该可以做到:
using (var stream = new MemoryStream())
{
input.CopyTo(stream);
File.WriteAllBytes(file, stream.ToArray());
}
将其包装在扩展方法中可以更好地命名:
public void WriteTo(this Stream input, string file)
{
//your fav write method:
using (var stream = File.Create(file))
{
input.CopyTo(stream);
}
//or
using (var stream = new MemoryStream())
{
input.CopyTo(stream);
File.WriteAllBytes(file, stream.ToArray());
}
//whatever that fits.
}
public void CopyStream(Stream stream, string destPath)
{
using (var fileStream = new FileStream(destPath, FileMode.Create, FileAccess.Write))
{
stream.CopyTo(fileStream);
}
}
public void testdownload(stream input)
{
byte[] buffer = new byte[16345];
using (FileStream fs = new FileStream(this.FullLocalFilePath,
FileMode.Create, FileAccess.Write, FileShare.None))
{
int read;
while ((read = input.Read(buffer, 0, buffer.Length)) > 0)
{
fs.Write(buffer, 0, read);
}
}
}