在EndOfData为true之前,Stream正在处理

我正在编写一个连接到FTP的方法,将csv文件读入流中,然后使用TextFieldParser处理数据。

这一切都在工作,除了我遇到的一个问题,当它突然读到CSV的一半时我突然得到一个ObjectDisposedExceptionexception。 我已经尝试将StreamReader和TextReader传递给TextFieldParser,但两者都会导致同样的问题。

我应该将CSV下载到临时本地目录然后读取它还是没有问题从FTP读取文件? 我想可能有一些服务器设置可能在读取整个文件之前超时流。

FtpWebRequest request = (FtpWebRequest)FtpWebRequest.Create("REMOVED.csv"); request.Credentials = new NetworkCredential("xyz", "*******"); using (WebResponse response = request.GetResponse()) { using (Stream stream = response.GetResponseStream()) { using (TextReader reader = new StreamReader(stream)) { using (TextFieldParser parser = new TextFieldParser(reader)) { parser.HasFieldsEnclosedInQuotes = true; parser.Delimiters = new string[] { "," }; while (!parser.EndOfData) //exception is thrown here about 1500lines into csv { Console.WriteLine(parser.ReadLine().ToString()); } } } } } 

之前的最后一行输出

190500,Courier Delivery,Freight,Distributor,1,5,15 / 12/2014 16:44

如果我应该首先下载文件,我只使用WebClient.DownloadFile()?? 如何判断文件何时完成下载然后阅读?

编辑:

系统网络跟踪输出显示以下内容

System.Net.Sockets详细:0:[10412]退出套接字#24914721 :: Receive() – > Int32#95 System.Net信息:0:[10412] FtpControlStream#15315213 – 收到响应[226-文件已成功传输226 5.748秒(此处测量),每秒30.91千字节] System.Net信息:0:[10412] FtpWebRequest#16868352 ::(释放FTP连接#15315213。)

进一步编辑

System.Net Tracing的输出显示了接收到的CSV的最后一行,为什么解析器在完成之前处理? 我对编程还很陌生,所以我不确定如何继续

因此,在我使用TextFieldParser读到最终之前,我无法弄清楚如何停止流处理,而是执行了以下操作:

 Connect to FTP Read the file into a stream Copy the stream to a FileStream and create a temporary file Read the temporary file Delete the temporary file 

这不是很优雅但是如果有其他人遇到上述错误,则知道下载文件是另一种选择。

使用Peek方法而不是EndOfData – 没有测试过这个,但应该工作……

 //... using (var response = request.GetResponse()) { using (var stream = response.GetResponseStream()) { using (var reader = new StreamReader(stream)) { while (reader.Peek() != -1) //use Peek instead { Console.WriteLine(reader.ReadLine()); } } } } //...