2

私にはValidate(Stream inputStream)方法があります。このメソッドは、 inputStreamをそれぞれに渡すことによって、他のいくつかの検証メソッドを呼び出します。これらはそれぞれ、新しいファイルを作成しTextFieldParser、ファイルを読み取り/検証します。

最初ValidateA(inputStream)に呼び出されると、機能します。しかし、2番目ValidateB(inputStream)が呼び出されると、これparser.EndOfDatatrueなので、フィールドを読み取りません。

コードを最も単純な形式にクリーンアップしようとしました。

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;
}       
4

1 に答える 1