2

---简短版:当我到达第while (!checkReader.EndOfStream)一个之后的每次时,它都会说EndOfStream = true

---更多细节:用户将使用 Ajax AsyncFileUpload 控件上传文件。我拿了那个文件,确保它是我们使用的一种非常特殊的 csv 格式,然后将它吐出到 GridView 中。这一切第一次都很好用:我得到文件,解析它,它显示得很好。
但是,如果我在用户会话期间的任何时候再次调用相同的代码,StreamReader.EndOfStream = true.

例如,用户上传了一个文件,我将其吐出到 GridView 中。哎呀!用户意识到有标题...我有一个可用的复选框,事件处理程序将调用下面的方法来重新读取原始文件(它存储在会话变量中)。用户选中该框,事件触发,方法被调用,但我EndOfStream的现在是真的。

我认为这using ()会改变那个标志,我尝试checkReader.DiscardBufferedData在下面的 while 循环之后添加,但这些似乎都没有任何影响。

我究竟做错了什么?

 private void BuildDataFileGridView(bool hasHeaders)
{   
    //read import file from the session variable
    Stream theStream = SessionImportFileUpload.PostedFile.InputStream;
    theStream.Position = 0;

    StringBuilder sb = new StringBuilder();

    using (StreamReader checkReader = new StreamReader(theStream))
    {
        while (!checkReader.EndOfStream)
        {
            string line = checkReader.ReadLine();
            while (line.EndsWith(","))
            {
                line = line.Substring(0, line.Length - 1);
            }
            sb.AppendLine(line);
        }
    }

    using (TextReader reader = new StringReader(sb.ToString()))
    { 
        //read the file in and shove it out for the client
        using (CsvReader csv = new CsvReader(reader, hasHeaders, CsvReader.DefaultDelimiter))
        {
            sDataInputTable = new DataTable();

            try
            {
                //Load the DataTable with csv values  
                sDataInputTable.Load(csv);
            }
            catch
            {
                DisplayPopupMessage("ERROR: A problem was encountered");
            }

            //Copy only the first 10 rows into a temp table for display.  
            DataTable displayDataTable = sDataInputTable.Rows.Cast<System.Data.DataRow>().Take(10).CopyToDataTable();

            MyDataGridView.DataSource = displayDataTable;
            MyDataGridView.DataBind();
        }
    }
}

编辑: SessionImportFileUpload 是实际的 Ajax AsyncFileUpload 控件,它被存储为会话变量(以前的人在使用它时写过其他东西,这已经是这种情况了)。

4

1 回答 1

2

您将发布的文件流存储在 Session 中。这是不正确的,因为流不是数据,而是读取数据的机制。该文件仅在单个 POST 请求期间上传一次,以后您将无法再次从同一流中读取。通常你甚至不能倒带流重新阅读它。

这就是为什么我建议只读取一次发布的文件流并将整个内容放入 Session 中 - 这样内容将是可重用的,并且您可以根据需要多次重新处理它。

于 2013-10-22T18:43:43.783 回答