FileStream每隔一个字符返回空字符

5

我似乎在C#的FileStream中遇到了一些问题。我正在尝试从一个非常大的文本文件(10MB),由MSI安装程序生成,中读取最后一行。

我使用的代码是:

string path = @"C:\uninstall.log";
byte[] buffer = new byte[100];

using (FileStream fs = new FileStream(path, FileMode.Open, FileAccess.Read))
{
    long len = fs.Length;

    fs.Seek(-100, SeekOrigin.End);

    fs.Read(buffer, 0, 100);
}

string foo = Encoding.UTF8.GetString(buffer);
Console.WriteLine("\"" + foo + "\"");

但输出结果类似于这样:
H E L L O   W O R L D ! ! ! B L A H   B L A H

显然,被读取的流中每隔一个字符就包含一个'\0'(空字符)。 有人知道是什么原因导致了这种情况吗?


2
尝试使用UTF16。这只是一条注释。如果我确定了,我会将其发布为答案。 - paparazzo
4
UTF7UTF8UTF32不同,UTF-16的属性被称为“Unicode”。 - Daniel Brückner
3个回答

8

是的,就是这样。不过很奇怪,你会认为文件流会跳过空字符或者任何解码器都会跳过。 - tcables
2
跳过空字节对于 FileStream 来说是奇怪和意外的行为 - 有很多文件格式在其中空字节是有意义的! - Blorgbeard
由于空字符是有效的UTF-8字符,因此FileStream不应跳过它们。虽然很高兴它能正常工作! - prprcupofcoffee

7
该文件可能是UTF-16文件,而不是UTF-8文件。尝试使用 Encoding.Unicode 而不是 Encoding.UTF8

是的,那似乎就是问题所在了。不过我会把答案授予David,因为他告诉我如何修复它而不仅仅是指出了问题。 - tcables

3
听起来文件实际上是UTF-16编码的。请在您的GetString()中更改为UTF-8。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接