Прочитайте файл сразу после его загрузки в ASP.NET core MVC

Я только что загрузил файл в папку wwwroot/files моего проекта. Что я намерен сделать, так это прочитать файл сразу после его загрузки. Код, который я использовал для загрузки файла, работает нормально, но код для чтения файла выдает следующее исключение: При обработке запроса возникло необработанное исключение. IOException: процесс не может получить доступ к файлу «campuses.sql», так как он используется другим процессом. Campuses.sql — это файл, который я пытаюсь загрузить и прочитать. Ниже приведен мой код для загрузки и чтения файла.

 public IActionResult Institution(IFormFile InstitutionFile)
    {
        if(InstitutionFile != null)
        {
            var fileName = Path.Combine(he.WebRootPath + "/files/", Path.GetFileName(InstitutionFile.FileName));
            InstitutionFile.CopyTo(new FileStream(fileName, FileMode.Create));

       //Everything runs fine till here

            int counter = 0;
            string line;

            // Read the file and display it line by line.  
            System.IO.StreamReader file =
                new System.IO.StreamReader(fileName);
            while ((line = file.ReadLine()) != null)
            {
                System.Console.WriteLine(line);
                counter++;
            }

            file.Close();

            System.Console.ReadLine();



        }

        return RedirectToAction("Index", "Institutions");

    }

Итак: 1. Я подозреваю, что это процесс загрузки, который все еще использует файл. Как я могу остановить процесс с помощью файла, чтобы я мог его прочитать?

  1. Есть ли другой способ, который может помочь мне обойти это?

Я намерен читать данные из файла .csv и вставлять записи в базу данных в долгосрочной перспективе.

Спасибо!


person Caleb Rotich    schedule 01.03.2018    source источник
comment
Вы используете FileStream и не удаляете его (на самом деле вы не удаляете ни один из ваших потоков). Вы всегда должны удалять экземпляры, реализующие IDisposable, чтобы высвободить неуправляемые ресурсы. Проверка этого ответа   -  person IPValverde    schedule 01.03.2018
comment
Спасибо, ваш комментарий очень помог. @IPValverde   -  person Caleb Rotich    schedule 02.03.2018


Ответы (1)


Читать из InstitutionFile вместо физического файла.

Также поместите FileStream в блок using, чтобы он освободил файл.

var fileName = Path.Combine("" + "/files/", Path.GetFileName(InstitutionFile.FileName));
using (var fileStream = new FileStream(fileName, FileMode.Create))
      InstitutionFile.CopyTo(fileStream);

var st = new MemoryStream();
InstitutionFile.CopyTo(st);
var content = Encoding.ASCII.GetString(st.ToArray());
person tchelidze    schedule 01.03.2018
comment
Это может сработать, но проблема в том, что файл по-прежнему будет недоступен для других процессов, которые могут захотеть его использовать. - person Caleb Rotich; 01.03.2018
comment
@CalebRotich после того, как FileStream закончит запись и выйдет за рамки (в конце действия), он освободит файл. - person tchelidze; 01.03.2018
comment
Помещение FileStream в блок Using сработало, спасибо. Хотя все остальное оставалось постоянным. - person Caleb Rotich; 02.03.2018