c# - 为什么会出现这些 nul

标签 c# filestream

我曾经使用以下函数写入很多不同的文件

using (FileStream fs = new FileStream(Settings.PsLog, FileMode.Truncate, System.Security.AccessControl.FileSystemRights.Write, FileShare.ReadWrite, 1024, FileOptions.None, null))
{
    foreach (string line in checkList)
    {
        byte[] encodedText = Encoding.Unicode.GetBytes(line + Environment.NewLine);
        await fs.WriteAsync(encodedText, 0, line.Length);
    }
}

由于这段代码是复制粘贴的,所以我决定将其提取为一个更通用的函数。

private static async Task WriteTextAsync(string filePath, string text)  
{
    byte[] encodedText = Encoding.Unicode.GetBytes(text + Environment.NewLine);
    using (FileStream sourceStream = new FileStream(filePath,
           FileMode.Append, FileAccess.Write, FileShare.Write,
           bufferSize: 1024, useAsync: true))
    {
        await sourceStream.WriteAsync(encodedText, 0, encodedText.Length);
    };
}

但是在使用提取的版本后,随机的 NUL 被附加到文本中

enter image description here

这些空值是从哪里来的?我也尝试复制 filestream() 设置 1 对 1,但即使这样 NUL 也发生了。

最佳答案

您的原始代码已损坏。

Encoding.Unicode使用,line.LengthencodedText.Length 不同.当您尝试写入数据时,您只写入了大约一半(平均)。

由于在您的示例中实际上并没有发生这种情况,最可能的原因是您实际上没有使用 Encoding.Unicode , 而不是 Encoding.UTF8或单字节 ANSI/ASCII 编码之一。

无论哪种情况,请确保您写入的字节数与要写入的字节数一样多。字符数无关紧要。并确保使用正确的编码 - 只能有一个。

作为旁注,您的代码也将比原始代码慢得多。这很可能是一个糟糕的权衡。相反,您可能想要捕获整个 foreach , 并传递 IEnumerable<string>而不仅仅是 string .如果在某些情况下你真的只需要写一个字符串,你可以提供一个 params string过载或任何最适合你的。并确保所有情况实际上都是等价的 - 这个肯定不是,因为原始文件在原始代码中被丢弃,而它只被附加到您的代码中。

关于c# - 为什么会出现这些 nul,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37232350/

相关文章:

c++ - 如何将二进制文件内容读取为字符串?

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

c# - 如何使用 C# 将带反斜杠的字符串插入到表中

c# - 使用 Redis、key 或 Id 存储对象标识符?

c# - 如何在没有布局问题的情况下在运行时更改语言

c# - 我的服务器程序接收到的字节不完整。为什么?我正在使用 C# .net 套接字

java - 将文件项转换为文件

c# - BinaryFormatter 和反序列化。如何在流的末尾停止?

c# - 基于数据库值的更改控制

c# - 在 .NET 中比较不同的数字类型(int、float、double、...)