【问题标题】:MemoryStream output to a file c#MemoryStream 输出到文件 c#
【发布时间】:2017-04-10 14:40:32
【问题描述】:

我有以下代码:

string fileName = GetFileName();
using (var stream = new MemoryStream())
{
    using (var sw = new StreamWriter(stream))
    {            
        for (int i = 0; i < 20; i++)
        {
            sw.WriteLine(String.Format("{0};{1};{2};{3};{4};{5}", i.ToString(), (i*2).ToString(), "-_-_-", "-_" + i.ToString() + "_-", "3", "15"));
        }

        // Check if compression needed.
        if (stream.Length > limit)
        {
            sw.Flush();
            stream.Position = 0;

            using (Ionic.Zip.ZipFile zipFile = new Ionic.Zip.ZipFile())
            {
                absoluteFileName = Path.GetFileName(fileName);
                zipFile.AddEntry(absoluteFileName, stream);

                zipFileName = Path.Combine(Path.GetDirectoryName(fileName), Path.ChangeExtension(absoluteFileName, ZipExtension));
                zipFile.Save(zipFileName);
            }
        }
        else
        {
            // no compression needed
            using (FileStream file = new FileStream(fileName, FileMode.Create, System.IO.FileAccess.Write))
            {
                byte[] bytes = new byte[stream.Length];
                stream.Read(bytes, 0, (int)stream.Length);
                file.Write(bytes, 0, bytes.Length);
                //stream.Close();
            }
        }
    }

我正在尝试生成一个纯文本文件,以防内存流长度(以字节为单位)不大于具体的字节数(限制(见条件)。

如果内存流长度大于具体的字节数,那么我创建一个压缩文件。

当我在不需要压缩时(stream.Length

我这样做是因为我不想直接在磁盘上创建文件,以防我需要压缩它。所以如果最后不需要压缩,我将所有的流内存写入一个文件,这就是问题所在,文件是空的,只有换行符。

我做错了什么?

更新2 我在条件之前放了下面一行:

 sw.Flush();
 stream.Position = 0;

现在内容已写入文件。

【问题讨论】:

  • 以后请多花点精力格式化您的代码。这次我已经为您完成了,但您确实有责任使代码尽可能可读。使用预览并问问自己这是否真的是您想要阅读代码的方式。
  • @JonSkeet 好的,谢谢。
  • else 分支中的stream.Position = 0; 在哪里?
  • 当乔恩在这里时,你一定会得到解决方案

标签: c# filestream streamwriter memorystream


【解决方案1】:

我的问题出在 else 正文中

嗯,你正在以与第一个 if 正文不同的方式处理它。

在第一个 if 正文中,您明确地刷新写入器并倒回流:

sw.Flush();
stream.Position = 0;

您没有在else 正文中执行任何一项操作,因此您不会获得任何已写入流的数据(无倒带),并且StreamWriter 中仍可能有数据缓冲(没有冲洗)。这是一个的问题。

接下来,您在不刷新StreamWriter 的情况下检查“限制”,这意味着可能会有更多数据意味着您应该压缩,但事实并非如此。所以我建议你在你的if 语句出现之前打电话给sw.Flush()

最后,我强烈建议不要无缘无故地创建另一个字节数组 - 您的最终 using 语句的主体可以是:

stream.CopyTo(file);

【讨论】:

  • 流中没有出现 CopyTo 方法,我在 Visual Studio 2008 下使用 .NET Framework 3.5。它仅适用于 .NET Framework 4.0 及更高版本。
  • @user1624552:如果你这么说会很有用 - 我认为大多数人认为你不受近 10 年前发布的框架的限制是合理的......你仍然不虽然不需要创建另一个字节数组。例如,您可以改用MemoryStream.GetBuffer()
  • 我同意,非常抱歉。非常感谢,你拯救了我的一天!
猜你喜欢
  • 1970-01-01
  • 2022-11-24
  • 1970-01-01
  • 2018-05-04
  • 2011-07-17
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多