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

时间:2015-01-16 02:10:57

标签: c# csv ftp textfieldparser

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

所有工作都在工作,除了我突然得到一个ObjectDisposedException异常后到达中途的问题。我试过通过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的最后一行,为什么解析器在完成之前处理?我对编程还很陌生,所以我不确定如何继续

2 个答案:

答案 0 :(得分:0)

所以在我使用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

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

答案 1 :(得分:-1)

  

使用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());
        }
      }
    }
  }
//...