我使用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)
虽然它没有解释发生了什么,但我个人会避免使用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.
你的流是否支持寻求?
我不确定为什么Peek方法在你的情况下返回-1,但通常用StreamReader类读取行到文件末尾的方法null是重复调用ReadLine方法直到返回:
string line;
while ((line = reader.ReadLine()) != null)
{
Console.WriteLine(line);
}
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
22830 次 |
| 最近记录: |