C#:使用StreamReader从txt文件中读取行,但Peek()返回-1,即使还有很多行

Ala*_*lan 3 c# peek

我使用StreamReader的Peek()方法来检查是否需要处理更多行.我的文件中有超过1000行,但Peek()在到达#750行时突然返回-1.我查了一下,但#750和#751之间似乎没有区别.即使我删除了#750和751行,它仍会在其他行中分解.

以下是我的代码供您参考:

try
{
    String ftpserver = ftp + filename;
    reqFTP = (FtpWebRequest)FtpWebRequest.Create(new Uri(ftpserver));
    reqFTP.UsePassive = false;
    reqFTP.UseBinary = true;
    reqFTP.Proxy = null;
    reqFTP.Credentials = new NetworkCredential(username, password);

    reqFTP.Method = WebRequestMethods.Ftp.DownloadFile;
    response = (FtpWebResponse)reqFTP.GetResponse();
    stream = response.GetResponseStream();
    reader = new StreamReader(stream, ConfigHelper.MyEncoding);
    while (reader.Peek() > -1)
    {
        string x = reader.ReadLine();
        if (x != null)
        {
          //.......
         }
    }
}
catch (Exception ex)
{
}
finally
{
    if (reader != null)
        reader.Close();
    if (response != null)
        response.Close();
}
Run Code Online (Sandbox Code Playgroud)

我试过了while ((x = reader.ReadLine()) != null),但是"无法访问被处置对象"的例外被抛弃了.

最后我通过使用: while (stream.CanRead && (x = reader.ReadLine()) != null)

Jon*_*eet 8

虽然它没有解释发生了什么,但我个人会避免使用Peek.我用的是:

string line;
while ((line = reader.ReadLine()) != null)
{
    // Use the line
}
Run Code Online (Sandbox Code Playgroud)

这样你就只能在一个地方读书.它在某种程度上比检查你是否可以阅读,然后阅读更加明智.

您还可以编写一个方法来创建IEnumerable<string>一个TextReader(或从一个Func<TextReader>或一个文件名),这可以使所有这一切更愉快.如果您只是在阅读文件并且使用的是.NET 4,那么File.ReadLines它已经内置了.

编辑:以下是您可能获得-1的一个原因,来自以下文档StreamReader.Peek:

表示要读取的下一个字符的整数,如果没有要读取的字符或者流不支持搜索,则返回-1.

你的流是否支持寻求?


dtb*_*dtb 6

我不确定为什么Peek方法在你的情况下返回-1,但通常用StreamReader类读取行到文件末尾的方法null是重复调用ReadLine方法直到返回:

string line;
while ((line = reader.ReadLine()) != null)
{
    Console.WriteLine(line);
}
Run Code Online (Sandbox Code Playgroud)