在使用块中包含 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.

解决这个问题的一种方法是从 StreamReaderCsvReader.

的 using 块中调用 ToList()
var learningTasksList = csv.GetRecords<LearningTask>().ToList();

如果您不想一次将整个文件读入内存,则必须将 CsvReader 传递给您的 GenerateNewLearningTasksList() 方法,然后关闭与 StreamReader 完成枚举后 learningTasksList.