C# StreamReader.ReadLine()不';不要消耗这条小溪
我正在启动一个新的web应用程序项目,用户可以在其中上载C# StreamReader.ReadLine()不';不要消耗这条小溪,c#,asp.net-mvc,asp.net-core,asp.net-core-2.0,C#,Asp.net Mvc,Asp.net Core,Asp.net Core 2.0,我正在启动一个新的web应用程序项目,用户可以在其中上载.csv文件,以便我可以处理该文件 目前我可以让用户上传文件,但当我尝试使用StreamReader读取从文件生成的流时,似乎StreamReader无法正确读取流 顺便说一下,对于上传文件部分,我遵循了Microsoft教程 下面是视图的代码 <form method="post" enctype="multipart/form-data" asp-controller="Upload" asp-action="Upload">
.csv
文件,以便我可以处理该文件
目前我可以让用户上传文件,但当我尝试使用StreamReader
读取从文件生成的流时,似乎StreamReader
无法正确读取流
顺便说一下,对于上传文件部分,我遵循了Microsoft教程
下面是视图的代码
<form method="post" enctype="multipart/form-data" asp-controller="Upload" asp-action="Upload">
<div class="form-group">
<div class="col-md-10">
<p>Upload one or more files using this form:</p>
<input type="file" name="files" >
</div>
</div>
<div class="form-group">
<div class="col-md-10">
<input type="submit" value="Upload" />
</div>
</div>
使用此表单上载一个或多个文件:
这是我的控制器代码
len、len2和p是用于调试的变量
[HttpPost]
public async Task<IActionResult> Upload(IFormFile file)
{
if (file != null && file.Length > 0)
{
var filePath = Path.GetTempFileName(); //Note: May throw excepetion when temporary file exceeds 65535 per server
var stream = new FileStream(filePath, FileMode.Create);
await file.CopyToAsync(stream);//
long len = stream.Length;// 412 bytes
StreamReader reader = new StreamReader(stream);//*
int p = reader.Peek();//currently the next character is EoF
var val = reader.ReadLine();
long len2 = stream.Length;// 412 bytes
bool end = reader.EndOfStream;// true
//do some stuff here
return RedirectToAction("Success");
}
else
{
return RedirectToAction("Upload_fail");//file not found
}
}
[HttpPost]
公共异步任务上载(IFormFile)
{
if(file!=null&&file.Length>0)
{
var filePath=Path.GetTempFileName();//注意:当每台服务器的临时文件超过65535时,可能会引发excepetion
var stream=newfilestream(filePath,FileMode.Create);
等待文件.CopyToAsync(流)//
long len=stream.Length;//412字节
StreamReader=新的StreamReader(流)//*
int p=reader.Peek();//当前下一个字符是EoF
var val=reader.ReadLine();
long len2=stream.Length;//412字节
bool end=reader.EndOfStream;//true
//在这里做些事情
返回操作(“成功”);
}
其他的
{
返回RedirectToAction(“上载失败”);//未找到文件
}
}
如果您有任何建议或帮助,我们将不胜感激。从流中读取时,当前位置将相应更新。例如,设想以下步骤:
wait file.CopyToAsync(stream)
将流的位置提升到EOF。因此,当您将StreamReader
包裹在它周围时,就没有什么可读的了。写入的过程是相同的,CopyToAsync
操作推进输入和输出流,一旦操作完成,两个流都处于EOF
让事情稍微复杂一点的是,流只能向前,这意味着一旦读取了数据,就不可能向后走。由于您正在使用文件流
,我认为您可以回到开头,如下所示:
await file.CopyToAsync(stream);
stream.Position = 0;
您还可以使用
stream.Seek(0,请参见korigin.Begin)
,如本答案中所述:从流中读取时,当前位置会相应更新。例如,设想以下步骤:
wait file.CopyToAsync(stream)
将流的位置提升到EOF。因此,当您将StreamReader
包裹在它周围时,就没有什么可读的了。写入的过程是相同的,CopyToAsync
操作推进输入和输出流,一旦操作完成,两个流都处于EOF
让事情稍微复杂一点的是,流只能向前,这意味着一旦读取了数据,就不可能向后走。由于您正在使用文件流
,我认为您可以回到开头,如下所示:
await file.CopyToAsync(stream);
stream.Position = 0;
您还可以使用
stream.Seek(0,请参阅korigin.Begin)
,如本答案中所述:在将流加载到读卡器之前,尝试将流的位置重置为0stream.Position=0
@Kyle谢谢你的建议,这确实有效。所以我想知道是什么原因导致该位置移动到文件的末尾?在将流加载到读卡器之前,请尝试将其位置重置为0stream.Position=0
@Kyle谢谢你的建议,这确实有效。所以我想知道是什么原因导致这个位置移动到文件的末尾?