将其内容导入数据库后,我需要删除csv文件。当我尝试执行此操作时,出现system.io异常,该文件正在由另一个进程使用。我曾尝试将读取包含在using块中,但文件随后未读取到我的目标IEnumerable。我的代码如下-对此提供的任何帮助都将不胜感激。
当我在using块中调用csv.Read来生成learningTasksList时,learningTasksList为null。但是,如果我省略了using块-如下面未注释的代码中所示,将正确填充leanringTasksList。但是,我获得了对象列表,但未处理该过程,之后无法删除文件上传的文件
private IEnumerable<LearningTask> GenerateNewLearningTasksList(string filePathToImport)
{
//using (var reader = new StreamReader(filePathToImport))
//using (var csv = new CsvReader(reader))
//{
// csv.Configuration.HeaderValidated = null;
// csv.Configuration.MissingFieldFound = null;
// try
// {
// var learningTasksList = csv.GetRecords<LearningTask>();
// return learningTasksList;
// }
// catch (Exception ex)
// {
// Log.Error("Error generating list of new Learning Tasks from csv - {Error}", ex.InnerException);
// return null;
// }
//}
//This works but I am unable to dispose of it after I have transferred the records to learningTasksList
var reader = new StreamReader(filePathToImport);
var csv = new CsvReader(reader);
csv.Configuration.HeaderValidated = null;
csv.Configuration.MissingFieldFound = null;
try
{
var learningTasksList = csv.GetRecords<LearningTask>();
return learningTasksList;
}
catch (Exception ex)
{
Log.Error("Error generating list of new Learning Tasks from csv - {Error}", ex.InnerException);
return null;
}
}
答案 0 :(得分:0)
在CsvHelper Getting Started页面上。
GetRecords<T>
方法将返回IEnumerable<T>
条记录的yield
。这意味着您在迭代记录时一次仅返回一条记录。这也意味着只有一小部分文件被读入内存。不过要小心。如果您执行任何执行LINQ投影的操作,例如调用.ToList()
,则整个文件将被读入内存。
解决此问题的一种方法是从ToList()
和StreamReader
的using块中调用CsvReader
。
var learningTasksList = csv.GetRecords<LearningTask>().ToList();
如果您不想一次将整个文件读入内存,则必须将CsvReader
传递给GenerateNewLearningTasksList()
方法,然后关闭与{{1}的连接}枚举StreamReader
之后。