C#:FileStream.Read()不读取文件,但返回0

4 c# filestream

我是这样做的:

static void Main(string[] args)
{
    string FileName = "c:\\error.txt";
    long FilePosition = 137647;

    FileStream fr = new FileStream(FileName, FileMode.Open);
    byte[] b = new byte[1024];
    string data = string.Empty;
    fr.Seek(FilePosition, SeekOrigin.Begin);
    UTF8Encoding encoding = new UTF8Encoding();

    while (fr.Read(b, 0, b.Length) > 0)
    {
        data += encoding.GetString(b);
    }
    fr.Close();
    string[] str = data.Split(new string[] { "\r\n" }, StringSplitOptions.None);
    foreach (string s in str)
    {
        Console.WriteLine(s);
    }
    Console.ReadKey();
}
Run Code Online (Sandbox Code Playgroud)

str数组以这些行结束:

*****手牌历史T5-2847880-18(比赛:S-976-46079)*****
手牌:8月11日星期二18:14

但文件中有更多行.

我已将error.txt上传到sentpace:http://www.sendspace.com/file/5vgjtn 这里是完整的控制台输出:the_same_site/file/k05x3a

请帮忙!我在这里真的很无能为力.提前致谢!

Jon*_*eet 16

您的代码中存在一些微妙的错误和问题:

  • 您假设已通过调用填充整个缓冲区 GetString(b)
  • 您假设每个缓冲区都在字符的末尾结束.使用TextReader(例如StreamReader)读取文本数据,避免此类问题.
  • 如果发生异常,您不会关闭文件(使用using指令)
  • 你在循环中使用字符串连接:prefer StringBuilder

正如其他人所指出的那样,File.ReadAllLines会避免很多这方面的工作.还有File.ReadAllText,TextReader.ReadToEnd对于非文件.

最后,Encoding.UTF8除非你真的需要调整一些选项,否则只需使用而不是创建新实例.