MemoryStream输出到文件c#

时间:2017-04-10 14:40:33

标签: c# filestream streamwriter memorystream

我的代码如下:

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

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

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

当我尝试在不需要压缩时将内存流的所有内容写入纯文本文件(stream.Length&lt; = limit)时,我的问题出现在else主体中。我得到一个39字节的文件,但是当我打开它时,它是空的,只有新行。

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

我做错了什么?

UPDATE2 我已经在条件之前放下线:

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

现在内容被写入文件。

1 个答案:

答案 0 :(得分:3)

  

我的问题在于其他身体

嗯,你以不同的方式处理第一个if身体。

在第一个if正文中,您将显式刷新编写器并重绕流:

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

您未执行else正文中的任何一项,因此您无法获取已经写入流的任何数据(无倒带),并且可能仍然是StreamWriter中的数据缓冲(无刷新)。那是一个问题。

接下来,您要检查自己的限制&#34;没有刷新StreamWriter,这意味着可能有更多的数据意味着你应该压缩,但你不是。因此,我建议您在发出sw.Flush()声明之前致电if

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

stream.CopyTo(file);