私にはValidate(Stream inputStream)
方法があります。このメソッドは、 inputStreamをそれぞれに渡すことによって、他のいくつかの検証メソッドを呼び出します。これらはそれぞれ、新しいファイルを作成しTextFieldParser
、ファイルを読み取り/検証します。
最初ValidateA(inputStream)
に呼び出されると、機能します。しかし、2番目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;
}
ここで問題が発生します。EndOfData
フィールドがリセットされないため、ValidateB メソッドはファイルを処理できません。
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;
}