- -简洁版本:
当我到达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 控件,被存储为会话变量(这已经是这种情况,因为以前的人编写了其他使用它的东西)。
您将发布的文件流存储在会话中。这是不正确的,因为流不是数据,而是读取数据的机制。该文件仅在单个 POST 请求期间上传一次,以后您将无法再次从同一流中读取文件。通常您甚至无法倒回流来重新读取它。
这就是为什么我建议仅读取发布的文件流一次并将整个内容放入会话中 - 这样内容将可重用,并且您将能够根据需要多次重新处理它。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)