【问题标题】:MemoryStream is not writing everything expected to the fileMemoryStream 没有将所有预期的内容写入文件
【发布时间】:2021-11-29 03:24:18
【问题描述】:

我的问题是将一些关于乘客的数据写入MemoryStream,然后将其复制到文件中。我需要用两种不同的方法来实现它。在方法中我需要使用Stream,然后在Main 函数中我使用MemoryStream。所以我写了这段代码:

    public static void WriteToStream(Stream stream)
    {
        Random rnd = new();
        StreamWriter sw = new(stream);

        for (int i = 0; i < 100; i++)
        {
            sw.WriteLine(i);
            sw.WriteLine($"Passanger{i}");
            sw.WriteLine(rnd.Next(0, 2) == 1);
        }
    }

    public static void CopyFromStream(Stream stream, string filename)
    {
        using var fs = File.Open(filename, FileMode.OpenOrCreate);
        stream.CopyTo(fs);
    }

主要功能:

MemoryStream ms = new();

StreamService.WriteToStream(ms);
ms.Seek(0, SeekOrigin.Begin);
StreamService.CopyFromStream(ms, "database.dat");

但是当我打开文件时,我发现并不是所有的乘客。我需要写100个passangers(根据第一种方法的循环)但只有87个passangers。文件如下所示:

//some other passangers from 0 to 82, everything is fine with them
83
Passanger83
False
84
Passanger84
False
85
Passanger85
True
86
Passanger86
False
87
Passanger87
T

正如您在文件末尾看到的那样,True 语句已损坏,并且此文件中没有足够的乘客。谁能告诉我是什么问题?

附:我今天已经在另一个问题中发布了这段代码,但现在我解决了以前的问题。现在我有另一个问题,所以它不是重复的。

【问题讨论】:

  • 尝试添加sw.Flush();

标签: c# .net file stream memorystream


【解决方案1】:

尝试在您的WriteToStream 方法中将StreamWriter.AutoFlush 属性设置为true

StreamWriter sw = new(stream) { AutoFlush = true };

如果您的文件存在,则添加手动删除以进行正确覆盖:

public static void CopyFromStream(Stream stream, string filename)
{
    if (File.Exists(filename))
        File.Delete(filename);

     using var fs = File.Open(filename, FileMode.OpenOrCreate);
     stream.CopyTo(fs);
}

经过多次迭代测试并运行良好。

【讨论】:

  • 所以在第一个方法的末尾添加 sw.Flush() 就足够了,但是您的方法也可以正常工作。非常感谢!
猜你喜欢
  • 1970-01-01
  • 2021-11-29
  • 2012-11-05
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多