我曾经使用以下函数写入很多不同的文件
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 被附加到文本中
这些空值是从哪里来的?我也尝试复制 filestream()
设置 1 对 1,但即使这样 NUL 也发生了。
最佳答案
您的原始代码已损坏。
当 Encoding.Unicode
使用,line.Length
与 encodedText.Length
不同.当您尝试写入数据时,您只写入了大约一半(平均)。
由于在您的示例中实际上并没有发生这种情况,最可能的原因是您实际上没有使用 Encoding.Unicode
, 而不是 Encoding.UTF8
或单字节 ANSI/ASCII 编码之一。
无论哪种情况,请确保您写入的字节数与要写入的字节数一样多。字符数无关紧要。并确保使用正确的编码 - 只能有一个。
作为旁注,您的代码也将比原始代码慢得多。这很可能是一个糟糕的权衡。相反,您可能想要捕获整个 foreach
, 并传递 IEnumerable<string>
而不仅仅是 string
.如果在某些情况下你真的只需要写一个字符串,你可以提供一个 params string
过载或任何最适合你的。并确保所有情况实际上都是等价的 - 这个肯定不是,因为原始文件在原始代码中被丢弃,而它只被附加到您的代码中。
关于c# - 为什么会出现这些 nul,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37232350/