Файл используется другим процессом во время цикла while (С#)

86
9

В настоящее время у меня есть цикл while, который содержит оператор if:


if (s.Contains("mp4:production/CATCHUP/"))

Хотя, когда это условие истинно, и я пытаюсь использовать другие методы (как показано ниже, например, RemoveEXELog), я получаю доступ к отказу, который в настоящее время использует файл "Command.bat".


Как я могу остановить цикл записи файла при выполнении других методов?


private void CheckLog()
{
while (true)
{
Thread.Sleep(5000);
if (!System.IO.File.Exists("Command.bat")) continue;
using (System.IO.StreamReader sr = System.IO.File.OpenText("Command.bat"))
{
string s = "";
while ((s = sr.ReadLine()) != null)
{
if (s.Contains("mp4:production/CATCHUP/"))
{

RemoveEXELog(); // Deletes a specific keyword from Command.bat

Process p = new Process();
p.StartInfo.WorkingDirectory = "dump";
p.StartInfo.FileName = "test.exe";
p.StartInfo.Arguments = s;
p.Start();

ClearLog(); // Deletes Command.bat and then creates a new empty Command.bat
}
}
}
}
}

спросил(а) 2011-07-16T22:40:00+04:00 9 лет, 7 месяцев назад
1
Решение
61

private void CheckLog()
{
bool _found;
while (true)
{
string s = "";
_found = false;
Thread.Sleep(5000);
if (!System.IO.File.Exists("Command.bat")) continue;
using (System.IO.StreamReader sr = System.IO.File.OpenText("Command.bat"))
{
while ((s = sr.ReadLine()) != null)
{
if (s.Contains("mp4:production/CATCHUP/"))
{
_found = true;
break;
}

}
}
if (_found)
{
RemoveEXELog(); // Deletes a specific keyword from Command.bat

Process p = new Process();
p.StartInfo.WorkingDirectory = "dump";
p.StartInfo.FileName = "test.exe";
p.StartInfo.Arguments = s;
p.Start();

ClearLog(); // Deletes Command.bat and then creates a new empty Command.bat
}
}
}

ответил(а) 2011-07-16T22:45:00+04:00 9 лет, 7 месяцев назад
86

Другие решения должны работать на вас, однако вы также можете открыть файл следующим образом:


using (var sr = new FileStream("Command.bat", FileMode.Open, 
FileAccess.Read, FileShare.ReadWrite))
{
...
}

Это открывает файл в режиме только для чтения.

Затем в вашем методе RemoveEXELog() вы можете открыть его так:


using (var sr = new FileStream("Command.bat", FileMode.Open, 
FileAccess.ReadWrite, FileShare.ReadWrite))
{
...
}

Этот подход должен позволить вам открыть файл из обоих мест без получения исключения I/O, которое уже используется в файле.

ответил(а) 2011-07-16T22:50:00+04:00 9 лет, 7 месяцев назад
44

Я прав, это строки вашего кода:


RemoveEXELog(); // Deletes a specific keyword from Command.bat
ClearLog(); /

что-то делают с файлом Command.bat?
Если это так, вы должны вывести их из


using (System.IO.StreamReader sr = System.IO.File.OpenText("Command.bat"))

потому что этот читатель не позволяет другим программам редактировать файл.


Попробуйте использовать некоторые флаги bool:


bool needRemove = false, needClear = false;
using (System.IO.StreamReader sr = System.IO.File.OpenText("Command.bat"))
{
string s = "";
while ((s = sr.ReadLine()) != null)
{
if (s.Contains("mp4:production/CATCHUP/"))
{
needRemove = true;

Process p = new Process();
p.StartInfo.WorkingDirectory = "dump";
p.StartInfo.FileName = "test.exe";
p.StartInfo.Arguments = s;
p.Start();

needClear = true;
}
}
}

if (needRemove) RemoveEXELog(); // Deletes a specific keyword from Command.bat
if (needClear) ClearLog(); // Deletes Command.bat and then creates a new empty Command.bat

ответил(а) 2011-07-16T22:46:00+04:00 9 лет, 7 месяцев назад
Ваш ответ
Введите минимум 50 символов
Чтобы , пожалуйста,
Выберите тему жалобы:

Другая проблема