gpt4 book ai didi

c# - StreamWriter 在系统突然关闭时在文件末尾写入 NUL 字符

转载 作者:行者123 更新时间:2023-12-02 02:15:27 25 4
gpt4 key购买 nike

我正在编写一些测试应用程序以使用 StreamWriter 将一些文本写入文本文件。在执行 WriteLine 方法时系统突然关闭。重启机器后发现文件末尾有很多NUL字符。

搜索了许多站点,包括 MSDN 我没有找到这个问题的解决方案。

任何人都可以帮我解决这个问题。

如果我们执行以下步骤,这很容易重现:

  • 创建 WindowsApplication 并在其上放置一个按钮控件。
  • 在按钮单击事件处理程序中编写以下代码:

    private void button1_Click(object sender, EventArgs e)
    {
    string str = "Welcome to the C Sharp programming world with a test application using IO operations.";
    StreamWriter sw = new StreamWriter(fileName, true, Encoding.Unicode, str.Length);
    sw.WriteLine(str);
    sw.Close();
    }
  • 运行该应用程序并连续单击该按钮(直到机器关闭才执行此操作),然后按 PC 的 Poweroff 按钮。
  • 重新启动 PC 并检查包含以下文本的文件:

  • 欢迎来到带有使用 IO 操作的测试应用程序的 C Sharp 编程世界。

    欢迎来到带有使用 IO 操作的测试应用程序的 C Sharp 编程世界。

    欢迎来到带有使用 IO 操作的测试应用程序的 C Sharp 编程世界。

    欢迎来到带有使用 IO 操作的测试应用程序的 C Sharp 编程世界。

    欢迎来到带有使用 IO 操作的测试应用程序的 C Sharp 编程世界。

    欢迎来到带有使用 IO 操作的测试应用程序的 C Sharp 编程世界。

    NULNULNULNULNULNULNULNULNULNNULNULNULNULNULNNULNNULUNULNULNULNULNULNULNULNULNULNUL

    NUL 字符将出现在 NotePad++ 中,而我们在普通 NotePad 中看不到这些字符。

    提前致谢

    最佳答案

    我在 linux (在树莓上)上的 netcore 遇到了同样的问题。看起来他们是某种没有及时刷新的缓冲区。 ( StreamWriter.Flush() 方法没有帮助)。
    解决方法是将缓冲区大小设置为数据大小 array.Length并使用 FileOptions.WriteThrough 禁用所有缓存(来自 msdn:)

    Indicates that the system should write through any intermediate cacheand go directly to disk.

    string str = "Welcome to the C Sharp programming world with a test application using IO operations.";
    byte[] data = new UTF8Encoding(true).GetBytes(str);
    using (FileStream fs = new FileStream(fileName, FileMode.Append, FileAccess.Write,
    FileShare.Read, data.Length, FileOptions.WriteThrough))
    {
    fs.Write(data , 0, data.Length);
    }
    对于那些来自 C/C++ 的人,它设置了 posix 标志:

    O_DIRECT Try to minimize cache effects of the I/O to and from thisfile. In general this will degrade performance, but it is useful inspecial situations, such as when applications do their own caching.File I/O is done directly to/from user space buffers.


    更多信息: SO question

    关于c# - StreamWriter 在系统突然关闭时在文件末尾写入 NUL 字符,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10913632/

    25 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com