读取文件输入流两次
本文关键字:两次 文件 输入流 读取 | 更新日期: 2023-09-27 18:17:33
我需要读取csv文件两次。 但初读后:
using (var csvReader = new StreamReader(file.InputStream))
{
fileFullText += csvReader.ReadToEnd();
file.InputStream.Seek(0, SeekOrigin.Begin);
csvReader.Close();
}
在 enother 函数中使用文件:
public static List<string> ParceCsv(HttpPostedFileBase file)
{
//file.InputStream.Seek(0, SeekOrigin.Begin);
using (var csvReader = new StreamReader(file.InputStream))
{
// csvReader.DiscardBufferedData();
// csvReader.BaseStream.Seek(0, SeekOrigin.Begin);
string inputLine = "";
var values = new List<string>();
while ((inputLine = csvReader.ReadLine()) != null)
{
values.Add(inputLine.Trim().Replace(",", "").Replace(" ", ""));
}
csvReader.Close();
return values;
}
}
该文件。长度为 0。有人可以帮忙吗?
原因是SteramReader
的Dispose()
方法也关闭了底层流;在您的情况下file.InputStream
.using
语句隐式调用Dispose()
。在完成两个读取操作后,尝试将 using 替换为释放两个 StreamReaded
-s。我记得有些流类有一个布尔选项,可以在释放后保持底层流打开。
.NET 4.5 通过在构造函数中引入leaveOpen
参数SteamReader
修复了此问题。请参阅: MSDN
public StreamReader(
Stream stream,
Encoding encoding,
bool detectEncodingFromByteOrderMarks,
int bufferSize,
bool leaveOpen
)
还有一件事。当您将其包装在语句中时,您不需要自己关闭SteramReader
(带有 csvReader.Close();
的行using
因此Dispose()
和Close()
在StreamReader
的情况下是相同的。
如果你使用HttpPostedFileBase,你需要先克隆它,
在此处
使用此 git 的代码或者只是将其作为类添加到命名空间中:
public static class HttpPostedFileBaseExtensions
{
public static Byte[] ToByteArray(this HttpPostedFileBase value)
{
if (value == null)
return null;
var array = new Byte[value.ContentLength];
value.InputStream.Position = 0;
value.InputStream.Read(array, 0, value.ContentLength);
return array;
}
}
现在你可以像这样阅读 HttpPostedFileBase:
private static void doSomeStuff(HttpPostedFileBase file)
{
try
{
using (var reader = new MemoryStream(file.ToByteArray()))
{
// do some stuff... say read it to xml
using (var xmlTextReader = new XmlTextReader(reader))
{
}
}
}
catch (Exception ex)
{
throw ex;
}
}
使用它后,您仍然可以在主代码中编写:
file.SaveAs(path);
它会将其保存到文件中。