协慌网

登录 贡献 社区

如何将流保存到 C#文件中?

我有一个StreamReader对象,现在我想将此流保存到磁盘(该流可以是.gif.jpg.pdf )。

现有代码:

StreamReader sr = new StreamReader(myOtherObject.InputStream);
  1. 我需要将其保存到磁盘(我有文件名)。
  2. 将来我可能要将其存储到 SQL Server。

我也有编码类型,如果将其存储到 SQL Server,我会需要该编码类型,对吗?

答案

正如 Jon Skeet 的回答中 Tilendor 所强调的那样,从. NET 4 开始CopyTo

var fileStream = File.Create("C:\\Path\\To\\File");
myOtherObject.InputStream.Seek(0, SeekOrigin.Begin);
myOtherObject.InputStream.CopyTo(fileStream);
fileStream.Close();

或使用using语法:

using (var fileStream = File.Create("C:\\Path\\To\\File"))
{
    myOtherObject.InputStream.Seek(0, SeekOrigin.Begin);
    myOtherObject.InputStream.CopyTo(fileStream);
}

不得StreamReader用于二进制文件(例如 gif 或 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是. NET 4 中引入的,其目的基本相同。

public void CopyStream(Stream stream, string destPath)
{
  using (var fileStream = new FileStream(destPath, FileMode.Create, FileAccess.Write))
  {
    stream.CopyTo(fileStream);
  }
}