我需要两次读取csv文件。但在第一次阅读后:
using (var csvReader = new StreamReader(file.InputStream))
{
fileFullText += csvReader.ReadToEnd();
file.InputStream.Seek(0, SeekOrigin.Begin);
csvReader.Close();
}
在另一个函数中使用文件:
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;
}
}
file.Length为0。 有人可以帮忙吗?
答案 0 :(得分:11)
原因是SteramReader
的{{1}}方法也关闭了基础流;在您的情况下Dispose()
。 file.InputStream
语句隐式调用using
。在完成两个读取操作后,尝试替换使用处理Dispose()
- s。我记得有些流类有一个bool选项,可以在处理后打开底层流。
.NET 4.5通过在StreamReaded
构造函数中引入leaveOpen
参数来解决此问题。请参阅:MSDN
SteamReader
还有一件事。在public StreamReader(
Stream stream,
Encoding encoding,
bool detectEncodingFromByteOrderMarks,
int bufferSize,
bool leaveOpen
)
语句中包装它时,您不需要自己关闭SteramReader
(csvReader.Close();
行),因此using
和Dispose()
是相同的Close()
的情况。
答案 1 :(得分:1)
如果你使用HttpPostedFileBase,你需要先克隆它,
使用这个git here的代码
或者只是将其添加为命名空间中的类:
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);
并将其保存到文件中。