使用memorystream清除二进制文件

时间:2013-12-01 14:11:34

标签: c# c#-4.0 memorystream binarywriter

我是一个带有内存流的二进制写入器,如果出现一个条件,我需要清除它:

public void Execute() {
    MemoryStream memoryStream = new MemoryStream();
    BinaryWriter writer = new BinaryWriter(memoryStream);
    Log log = new Log(writer);
    log.Write("OK1");
    ...

    // If condition
    memoryStream = new MemoryStream();
    ...
    log.Write("OK2");
    ...
}

public class Log {

    private BinaryWriter log;

    public Log(BinaryWriter bw)
    {
        log = bw;
    }

    public void write(string msg)
    {
        log.Write(msg);
    }
}

但问题是memorystream是空的。我已经尝试过再次创建一个新的BinaryWriter:

public void Execute() {
    MemoryStream memoryStream = new MemoryStream();
    BinaryWriter writer = new BinaryWriter(memoryStream);
    Log log = new Log(writer);
    log.Write("OK1");
    ...

    // If condition
    memoryStream = new MemoryStream();
    writer = new BinaryWriter(memoryStream);
    ...
    log.Write("OK2");
    ...
}

public class Log {

    private BinaryWriter log;

    public Log(BinaryWriter bw)
    {
        log = bw;
    }

    public void write(string msg)
    {
        log.Write(msg);
    }
}

但BinaryWriter和MemoryStream都是实用的。

如何用memorystream清除二进制文件?我需要将memorystream的最终内容写入文件。

谢谢!

3 个答案:

答案 0 :(得分:1)

此代码通过内存流初始化log对象,然后创建另一个内存流,其引用存储在memoryStream中,但log对象二进制文件具有其原始内存流,而不是新内存流记忆流。 您可以通过检查它们的HashCode来检查这一点。

答案 1 :(得分:1)

你的意思是你想写一个不同的MemoryStream吗?您已将旧writer的引用传递给Log,因此Log实例保留了引用。之后更改writer变量将不会生效。你需要

  1. 创建新日志并将新writer传递给它
  2. 公开一种Log方法,允许操纵对象保持的BinaryWriter

答案 2 :(得分:1)

第一个代码段不起作用,因为BinaryWriter仍在使用旧的MemoryStream引用。你不能说服它使用新的。

第二个代码段不起作用,因为您的Log类仍在使用旧的BinaryWriter引用。您可以通过添加更新“log”的方法来说服它使用新的。

或者你可以作弊并调用memoryStream.SetLength(0)强制它在开头重新开始。

请回顾一下使用MemoryStream进行日志记录的智慧。它的大小没有上限。大概是你正在寻找这种解决方法的原因。当你需要回放流时,完全抛弃所有并不是很好。 Murphy将确保在您需要日志信息以解决问题的确切时刻发生这种情况。 circular buffer没有这个问题。