在使用块中包含 csv.Reader 并在上传后删除文件时出现问题
Problem with enclosing csv.Reader in using block and deleting file after uploading
将 csv 文件的内容导入我的数据库后,我需要删除它。当我尝试这样做时,我得到一个 system.io 异常,指出该文件正在被另一个进程使用。我曾尝试将读取内容包含在一个 using 块中,但文件不会被读取到我的目标 IEnumerable。我的代码在下面 - 非常感谢任何帮助解决这个问题。
当我调用 csv.Read 在 using 块中生成 learningTasksList 时,learningTasksList 为空。但是,如果我省略了 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;
}
}
来自 CsvHelper Getting Started 页面。
The GetRecords<T>
method will return an IEnumerable<T>
that will yield
records. What this means is that only a single record is returned at a time as you iterate the records. That also means that only a small portion of the file is read into memory. Be careful though. If you do anything that executes a LINQ projection, such as calling .ToList()
, the entire file will be read into memory.
解决这个问题的一种方法是从 StreamReader
和 CsvReader
.
的 using 块中调用 ToList()
var learningTasksList = csv.GetRecords<LearningTask>().ToList();
如果您不想一次将整个文件读入内存,则必须将 CsvReader
传递给您的 GenerateNewLearningTasksList()
方法,然后关闭与 StreamReader
完成枚举后 learningTasksList
.
将 csv 文件的内容导入我的数据库后,我需要删除它。当我尝试这样做时,我得到一个 system.io 异常,指出该文件正在被另一个进程使用。我曾尝试将读取内容包含在一个 using 块中,但文件不会被读取到我的目标 IEnumerable。我的代码在下面 - 非常感谢任何帮助解决这个问题。
当我调用 csv.Read 在 using 块中生成 learningTasksList 时,learningTasksList 为空。但是,如果我省略了 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;
}
}
来自 CsvHelper Getting Started 页面。
The
GetRecords<T>
method will return anIEnumerable<T>
that willyield
records. What this means is that only a single record is returned at a time as you iterate the records. That also means that only a small portion of the file is read into memory. Be careful though. If you do anything that executes a LINQ projection, such as calling.ToList()
, the entire file will be read into memory.
解决这个问题的一种方法是从 StreamReader
和 CsvReader
.
ToList()
var learningTasksList = csv.GetRecords<LearningTask>().ToList();
如果您不想一次将整个文件读入内存,则必须将 CsvReader
传递给您的 GenerateNewLearningTasksList()
方法,然后关闭与 StreamReader
完成枚举后 learningTasksList
.