2015-01-16 1 views
1

Я пишу метод, который подключается к FTP, читает файл csv в поток, а затем использует TextFieldParser для обработки данных.Поток удаляется до того, как EndOfData является истинным

Это все работает, за исключением проблемы, которую я получаю, когда это происходит примерно на полпути через чтение CSV, и вдруг я получаю исключение 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, Курьерская доставка, Перевозка грузов, Дистрибьютор, 1,5,15/12/2014 16:44

Если я должен сначала загрузите файл, просто я использую WebClient.DownloadFile() ?? Как я могу узнать, когда файл завершил загрузку, а затем прочитал его?

EDIT:

Система чистая калька выход показывает следующее

System.Net.Sockets Verbose: 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.)

ДАЛЕЕ EDIT

Выход из System.Net Трассировка показывает последнюю строку CSV принимаемой, так почему анализатор располагаетс до его завершения ?? Я по-прежнему совершенно не разбираюсь в программировании, поэтому я не уверен, как это сделать.

+0

Вы пробовали чтение строкового массива вместо TextFieldParser? Также откуда происходит выброс исключения? [Это из парсера? ] –

+0

'WebClient.DownloadFile()' является синхронным, вы можете прочитать файл сразу после завершения вызова.Оригинальная проблема выглядит странно для меня: вы уверены, что это не в коде, который вы удалили? – Zruty

+0

Я прокомментировал весь код, который был удален, выровняем одну строку - Console.WriteLine (parser.ReadLine(). ToString()); который я прочитал. строки csv, которые он терпит неудачу, я добавил как «выход» в исходное сообщение. @KCdod исключение выбрано в while (! Parser.EndOfData) –

ответ

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

Используйте метод 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()); 
     } 
     } 
    } 
    } 
//... 
+0

'Peek' прервет цикл, когда на мгновение нет данных. Что происходит довольно часто с сетевыми потоками. –

 Смежные вопросы

  • Нет связанных вопросов^_^