首页 / .NET / 正文

[.NET/C#]C#应用程序中如何将文件流保存成本地文件?

6701 发布于: 2018-01-24 读完约需7分钟

[.NET/C#]C#应用程序中如何将文件流保存成本地文件?

问题描述

如标题所述,在C#应用程序中,当前有一个使用 Stream 流初始化的 StreamReader 对象,如何将此文件流保存成本地文件呢(其中这个流有可能是 .gif,或者 .jpg 或者 .pdf 等等)?比如:

StreamReader sr = new StreamReader(myOtherObject.InputStream);

方案一

如果是.NET 4或者以上版本,你可以使用 streamCopyTo 方法:

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

或者,你也可以使用 using 语句块,把这个代码块放到 using 语句块中,如:

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

方案二

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);
}

方案三

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

方案四

private void SaveFileStream(String path, Stream stream)
{
    var fileStream = new FileStream(path, FileMode.Create, FileAccess.Write);
    stream.CopyTo(fileStream);
    fileStream.Dispose();
}

方案五

如果在.NET 4版本以下:

public void SaveStreamToFile(Stream stream, string filename)
{
   using(Stream destination = File.Create(filename))
      Write(stream, destination);
}

public void Write(Stream from, Stream to)
{
   for(int a = from.ReadByte(); a != -1; a = from.ReadByte())
      to.WriteByte( (byte) a );
}

或者:
先将输入流转换成字节数组

byte[] bytes = myOtherObject.InputStream.ToArray();

然后,再将字节数组写入文件:

public static void WriteFile(string fileName, byte[] bytes)
{
    string path = Path.GetDirectoryName(Assembly.GetExecutingAssembly().Location);
    if (!path.EndsWith(@"\")) path += @"\";

    if (File.Exists(Path.Combine(path, fileName)))
        File.Delete(Path.Combine(path, fileName));

    using (FileStream fs = new FileStream(Path.Combine(path, fileName), FileMode.CreateNew, FileAccess.Write)
    {
        fs.Write(bytes, 0, (int)bytes.Length);
        fs.Close();
    }
}

版权声明:本作品系原创,版权归码友网所有,如未经许可,禁止任何形式转载,违者必究。

上一篇: [.NET/C#]C#应用程序中如何从配置文件(app.config或web.config)中读取配置选项?

下一篇: [.NET/C#]C#应用程序中重复生成字符的方法你能想到哪些?

本文永久链接码友网 » [.NET/C#]C#应用程序中如何将文件流保存成本地文件?

分享扩散:

发表评论

登录用户才能发表评论, 请 登 录 或者 注册