С#, Файл блокирован процессом, хотя все потоки закрыты
Я изучаю 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 шт):
Оказалось, что ошибка крылась в том, что 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();
}