Я пишу метод, который подключается к 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 перед его завершением? Я по-прежнему новичок в программировании, поэтому я не уверен, как действовать дальше
Таким образом, я не смог понять, как остановить поток, оставшийся до того, как я прочитал до конца с помощью 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 - 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());
}
}
}
}
//...
Peek
будет прерывать цикл всякий раз, когда нет данных. Что происходит довольно часто с сетевыми потоками.
WebClient.DownloadFile()
работает синхронно, вы можете прочитать файл сразу после завершения вызова. Оригинальная проблема выглядит странно для меня, хотя: вы уверены, что это не в коде, который вы удалили?