Поток удаляется до истечения EndOfData

1

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

Все это работает, за исключением проблемы, которую я получаю, когда она появляется примерно на полпути через чтение 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()?? Как я могу узнать, когда файл завершил загрузку, а затем прочитал его?

РЕДАКТИРОВАТЬ:

Вывод трассировки сетевой сети показывает следующее

System.Net.Sockets Подробно: 0: [10412] Выход из сокета # 24914721 :: Receive() → Int32 # 95 System.Net Information: 0: [10412] FtpControlStream # 15315213 - Получен ответ [226-Файл успешно передан 226 5.748 секунд (измеряется здесь), 30,91 Кбайт в секунду] Информация о System.Net: 0: [10412] FtpWebRequest # 16868352: :( Отключение FTP-соединения # 15315213.)

ДАЛЬНЕЙШЕЕ ИЗМЕНЕНИЕ

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

  • 0
    Вы пробовали читать в массив String вместо TextFieldParser? Также откуда выбрасывает исключение? [Это из парсера? ]
  • 0
    WebClient.DownloadFile() работает синхронно, вы можете прочитать файл сразу после завершения вызова. Оригинальная проблема выглядит странно для меня, хотя: вы уверены, что это не в коде, который вы удалили?
Показать ещё 6 комментариев
Теги:
csv
ftp
textfieldparser

2 ответа

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

Это не очень изящно, но если кто-то еще сталкивается с вышеуказанной ошибкой, известно, что загрузка файла является альтернативой.

0

Используйте метод Peek вместо EndOfData - havent проверил это, но должен работать...

//...
  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 будет прерывать цикл всякий раз, когда нет данных. Что происходит довольно часто с сетевыми потоками.

Ещё вопросы

Сообщество Overcoder
Наверх
Меню