У меня есть метод Validate(Stream inputStream)
. Этот метод вызывает несколько других методов проверки, передавая inputStream каждому из них. Каждый из них создает новый TextFieldParser
и считывает/проверяет файл.TextFieldParser Не задает поле EndOfData
Когда вызывается первый ValidateA(inputStream)
, он работает. Но, когда вызывается второй ValidateB(inputStream)
, parser.EndOfData
равен true, поэтому он не читает поля.
Я попытался очистить код до его простейшей формы.
public int Validate(Stream inputStream, ref List<string> errors)
{
inputStream.Seek(0, SeekOrigin.Begin);
errors.AddRange(ValidateA(inputStream));
// The 2nd time, the EndOfData is true, so it doesn't read the fields
inputStream.Seek(0, SeekOrigin.Begin);
errors.AddRange(ValidateB(inputStream));
...
}
private List<string> ValidateA(Stream inputStream)
{
List<string> errors = new List<string>();
// Works fine the first time
using (var parser = new TextFieldParser(inputStream))
{
parser.TextFieldType = FieldType.Delimited;
parser.SetDelimiters(",");
parser.TrimWhiteSpace = true;
int lineNumber = 0;
while (!parser.EndOfData)
{
string[] fields = parser.ReadFields();
// Processing....
}
if (lineNumber < 2)
errors.Add(string.Format("There is no data in the file"));
}
return errors;
}
Здесь возникает проблема. Метод ValidateB не может обработать файл, потому что поле EndOfData
не получает сброс.
private List<string> ValidateB(Stream inputStream)
{
List<string> errors = new List<string>();
using (var parser = new TextFieldParser(inputStream))
{
parser.TextFieldType = FieldType.Delimited;
parser.SetDelimiters(",");
parser.TrimWhiteSpace = true;
int LineNumber = 0;
while (!parser.EndOfData)
{
// Processing....
}
}
return errors;
}
Я также попытался скопировать входной поток в новый поток, чтобы проверить, не сработает ли он. –
Значит, вы знаете, что Seek() фактически не реализован в * конкретном классе, который наследует от Stream. Как бы то ни было, отладчик говорит вам. Там где-то есть программист, который заслуживает от вас отвращения за то, что он не бросает InvalidOperationException, мы не можем помочь вам найти его. –