С#, Файл блокирован процессом, хотя все потоки закрыты

Я изучаю C#, и выполняю работу с файлами и потоками. Однако при выполнении программа выдаёт ошибку

System.IO.IOException: "Процесс не может получить доступ к файлу, так как этот файл используется другим процессом."

Ошибка появляется в следующем методе

private static void WriteInFile(string path, int stringNumber, int number)
    {
        string[] fileLines = File.ReadAllLines(path);
        fileLines[stringNumber] += " " + number;
        File.WriteAllLines(path,fileLines);
    }

На строке File.WriteAllLines(path,fileLines);

В программе используется поток чтения fileRead из файла, но он закрывается перед вызовом метода, в котором происходит ошибка:

      fileRead.Close();
      flag = false;
      WriteInFile(path, j, i);
      break;

По итогу нет потоков, что могли бы блокировать файл, но, тем не менее, ошибка всё равно возникает.

Метод полностью:

 private static void Write(int size, string path)
        {
            bool flag;
            string[] fileLines = new string[GroupCounter(size)];

            for (int i = 0; i < GroupCounter(size); i++)
            {
                fileLines[i] = "" + Math.Pow(2, i);
            }

            File.WriteAllLines(path, fileLines);

            for (int i = 1; i <= size; i++) //Цикл перебора всех значений и распредделения их по группам
            {
                flag = true;
                StreamReader fileRead = new StreamReader(path);

                for (int j = 0; flag && fileRead.ReadLine() != null; j++) //Перебираем имеющиеся строки
                {
                    string[] line = LineFromFile(path, j).Split(' ');
                    for (int k = 0; k < line.Length; k++) //Перебираем строку для сравнения 
                    {
                          //Если значение делится без остатка, то сразу переходим к следующей строке
                        if (i % Convert.ToInt32(line[k]) == 0 )
                        {
                            if (i == Convert.ToInt32(line[k]))
                            {
                                flag = false;
                            }
                            break;
                        } //Иначе если значение последнее в строке, то добавляем в строку текущее значение i
                        else
                        {
                            fileRead.Close();
                            flag = false;
                            WriteInFile(path, j, i);
                            break;
                        }
                    }
                }
            }
        }

Ответы (1 шт):

Автор решения: Rogotch

Оказалось, что ошибка крылась в том, что fileRead.Close() закрывался в каскаде условий и при его закрытии ещё и в конце внешнего цикла, ошибка исчезла. То есть, цикл стал выглядеть так:


            for (int i = 1; i <= size; i++) //Цикл перебора всех значений и распредделения их по группам
            {
                flag = true;
                StreamReader fileRead = new StreamReader(path);

                for (int j = 0; flag && fileRead.ReadLine() != null; j++) //Перебираем имеющиеся строки
                {
                    string[] line = LineFromFile(path, j).Split(' ');
                    for (int k = 0; k < line.Length; k++) //Перебираем строку для сравнения 
                    {
                          //Если значение делится без остатка, то сразу переходим к следующей строке
                        if (i % Convert.ToInt32(line[k]) == 0 )
                        {
                            if (i == Convert.ToInt32(line[k]))
                            {
                                flag = false;
                            }
                            break;
                        } //Иначе если значение последнее в строке, то добавляем в строку текущее значение i
                        else
                        {
                            fileRead.Close();
                            flag = false;
                            WriteInFile(path, j, i);
                            break;
                        }
                    }
                }
                fileRead.Close();
            }
→ Ссылка