Я пытаюсь реализовать некоторые базовые функциональные возможности чтения/записи/редактирования файла конфигурации в классе. Файл конфигурации хранится в файле [...]\config.txt, который хранится в переменной 'path'.
Синтаксис моего файла конфигурации следующий:
param0 value_of_it
param1 value_of_it
something_else you_get_it
Все, что осталось от первого пробела, является именем, по которому нужно найти параметр, остальная часть строки считается значением этого параметра.
Так много для контекста. Теперь, когда я пытаюсь удалить этот файл с помощью file.delete, я получаю:
«System.IO.IOException: невозможно получить доступ к файлу, так как он используется другим процессом».
Вот рассматриваемый код:
internal void alter(string param, bool replace = false, string value = null) {
//here
string buf;
System.IO.StreamReader reader = new System.IO.StreamReader(path);
string bufPath = path.Substring(0, path.Length-4)+"_buf.txt";
System.IO.StreamWriter writer = new StreamWriter(bufPath);
while((buf = reader.ReadLine()) != null) {
if(buf.Substring(0, param.Length) != param)
writer.WriteLine(buf);
else if(replace)
writer.WriteLine(param+" "+value);
}
writer.Dispose();
reader.Dispose();
writer.Close();
reader.Close();
//there
File.Delete(path);
File.Move(bufPath, path);
}
Функция построчно копирует исходный файл в буфер, кроме параметра, указанного в вызове. Эта строка либо игнорируется, то есть удаляется, либо заменяется, если об этом говорится в вызове. Затем исходный файл удаляется и туда "переносится" (переименовывается) версия _buf.
Эти шаги выполняются правильно (файл _buf создается и правильно заполняется) до «File.Delete (путь)», где возникает исключение.
Я уже пытался закомментировать всю часть между //здесь и //там и удалить только файл, что приводит к тому же исключению, поэтому проблема должна быть более простой.
Я попытался найти процесс с проблемным дескриптором с помощью Sysinternals Process Explorer, как было предложено здесь, на ServerFault, но ничего не нашел. Я нашел только три дескриптора для этого файла в своем собственном процессе. Я также запустил приложение после того, как убил проводник Windows, потому что я читал, что иногда это преступник; Это тоже не помогло.
Я также проверил всю остальную часть моей программы и подтвердил следующее:
Этот файл используется впервые, поэтому забытые дескрипторы из прошлого невозможны.
Это однопоточное приложение (пока что), поэтому взаимоблокировки и условия гонки также исключены.
Итак, вот мой вопрос: как я могу найти то, что блокирует мой файл? В качестве альтернативы: есть ли более простой способ удалить или отредактировать строку в файле?
Close
, потомDispose
(не иначе). Это наверное причина. - person Sinatr   schedule 06.01.2014File.Delete(path)
с тем же результатом: -/ - person Mark   schedule 06.01.2014