Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/281.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# StreamReader.ReadLine()不';不要消耗这条小溪_C#_Asp.net Mvc_Asp.net Core_Asp.net Core 2.0 - Fatal编程技术网

C# StreamReader.ReadLine()不';不要消耗这条小溪

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">

我正在启动一个新的web应用程序项目,用户可以在其中上载
.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(“上载失败”);//未找到文件
}
}

如果您有任何建议或帮助,我们将不胜感激。

从流中读取时,当前位置将相应更新。例如,设想以下步骤:

  • 该位置从0(流的开始)开始
  • 读取单个字节-这会将位置更新为1
  • 读取另一个字节-这会将位置更新为2
  • 如果流中只有两个字节,则该位置现在被认为是-不再可能读取其他字节,因为它们已经被读取

    与您的示例相关,调用
    wait file.CopyToAsync(stream)
    将流的位置提升到EOF。因此,当您将
    StreamReader
    包裹在它周围时,就没有什么可读的了。写入的过程是相同的,
    CopyToAsync
    操作推进输入和输出流,一旦操作完成,两个流都处于EOF

    让事情稍微复杂一点的是,流只能向前,这意味着一旦读取了数据,就不可能向后走。由于您正在使用
    文件流
    ,我认为您可以回到开头,如下所示:

    await file.CopyToAsync(stream);
    stream.Position = 0;
    

    您还可以使用
    stream.Seek(0,请参见korigin.Begin)
    ,如本答案中所述:

    从流中读取时,当前位置会相应更新。例如,设想以下步骤:

  • 该位置从0(流的开始)开始
  • 读取单个字节-这会将位置更新为1
  • 读取另一个字节-这会将位置更新为2
  • 如果流中只有两个字节,则该位置现在被认为是-不再可能读取其他字节,因为它们已经被读取

    与您的示例相关,调用
    wait file.CopyToAsync(stream)
    将流的位置提升到EOF。因此,当您将
    StreamReader
    包裹在它周围时,就没有什么可读的了。写入的过程是相同的,
    CopyToAsync
    操作推进输入和输出流,一旦操作完成,两个流都处于EOF

    让事情稍微复杂一点的是,流只能向前,这意味着一旦读取了数据,就不可能向后走。由于您正在使用
    文件流
    ,我认为您可以回到开头,如下所示:

    await file.CopyToAsync(stream);
    stream.Position = 0;
    

    您还可以使用
    stream.Seek(0,请参阅korigin.Begin)
    ,如本答案中所述:

    在将流加载到读卡器之前,尝试将流的位置重置为0
    stream.Position=0
    @Kyle谢谢你的建议,这确实有效。所以我想知道是什么原因导致该位置移动到文件的末尾?在将流加载到读卡器之前,请尝试将其位置重置为0
    stream.Position=0
    @Kyle谢谢你的建议,这确实有效。所以我想知道是什么原因导致这个位置移动到文件的末尾?