在上传后使用csv.Reader封闭块并删除文件时出现问题

时间:2019-12-23 00:58:28

标签: csvhelper

将其内容导入数据库后,我需要删除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;
        }

    }

1 个答案:

答案 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之后。