2

我有一个Validate(Stream inputStream)方法。此方法通过将inputStream传递给每个验证方法来调用其他几种验证方法。这些中的每一个都会创建一个新TextFieldParser文件并读取/验证文件。

当第一个ValidateA(inputStream)被调用时,它会起作用。但是,当ValidateB(inputStream)调用2nd 时,它parser.EndOfData真的,所以它不会读取字段。

我试图将代码清理为最简单的形式。

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

1 回答 1

2

@HansPassant 的评论是正确的,并引导我改变传递数据的方式。我没有传递 a Stream,而是将 a 转换MemoryStreambyte[].

然后,在该ValidateX(byte[] fileByteArray)方法中,我将从MemoryStream字节数组创建一个新的并使用它。

例子:

Stream stream = model.PostedFile.InputStream;
MemoryStream memStream = new MemoryStream();
stream.CopyTo(memStream);
byte[] data = memStream.ToArray();
var result = ValidateB(data);

进而,

private List<string> ValidateB(byte[] fileByteArray)
{
    List<string> errors = new List<string>();
    MemoryStream ms = new MemoryStream(fileByteArray);
    ms.Position = 0;
    ms.Seek(0, SeekOrigin.Begin);
    using (var parser = new TextFieldParser(ms))
    {
        // Processing...
    }

}

这可以防止出现问题EndOfData并尝试访问已关闭的 Stream。

于 2015-10-13T19:16:16.033 回答