Файл используется другим процессом во время цикла while (C #) - PullRequest
3 голосов
/ 16 июля 2011

В настоящее время у меня есть цикл 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
                }
            }
        }
    }
}

Ответы [ 3 ]

3 голосов
/ 16 июля 2011

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

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))
{
    ...
}

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

1 голос
/ 16 июля 2011
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
            }
        }
    }
0 голосов
/ 16 июля 2011

Прав ли я, что строки этого кода:

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
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...