c# - MemoryStream输出到文件c#

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

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

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

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

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

我做错了什么?

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

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

现在内容已写入文件。

最佳答案

My problem is in the else body

好吧,您正在以不同于第一个 if 的方式处理它 body 。

在第一个if正文,您正在显式刷新编写器并倒带流:

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

你没有做 else 中的任何一个body,所以你不会得到任何已经写入流的数据(没有倒带)并且可能仍然有数据缓冲在 StreamWriter 中。 (无冲洗)。这是一个问题。

接下来,您将在不刷新 StreamWriter 的情况下检查您的“限制” ,这意味着可能有更多数据意味着您应该压缩,但您没有。所以我建议你调用sw.Flush()在你的 if 之前语句发生。

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

stream.CopyTo(file);

关于c# - MemoryStream输出到文件c#,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43326150/

相关文章:

c# - 在不同的程序集中访问私有(private)方法 C#

c# - CLR 在调用程序集中的任何方法之前调用的最早入口点是什么?

c++ - 文件流程序不显示 .exe 窗口

c# - 文件流、streamreader 和 streamwriter 的问题

.net - StreamWriter 不会刷新到 NetworkStream

c# - 如何在没有 com 库的情况下读写二进制 excel 文件

c++ - C++中的基本文件处理,EOF检测

sharepoint - 在SharePoint 2010中运行Move-SPSite移动网站集时出错

c# - 每次写入一行时都写入日志文件 : using (. .. new StreamReader)?

c# - 为什么 Equals 没有按预期工作