Как перенаправить StandardInput на процесс без немедленного выхода из процесса? - PullRequest
0 голосов
/ 10 сентября 2011

Я создал утилиту для блокировки файлов lockfile.exe, которая принимает два параметра: fileName (файл должен быть заблокирован) и fileShare (общий ресурс, который будет применен).Затем я вызываю эту утилиту из другого приложения, чтобы проверить условия ошибок при обработке заблокированных файлов.Утилита lockfile.exe блокирует файл с указанным общим ресурсом, а затем ожидает ввода любого символа для снятия блокировки и выхода.

В моем тестовом приложении я создал класс FileLocker с двумя методами LockFile иUnlockFile следующим образом:

public class FileLocker
{
    private Process process;

    public void LockFile(string fileName)
    {
        this.process = new Process();
        this.process.StartInfo.RedirectStandardInput = true;
        this.process.StartInfo.UseShellExecute = false;
        this.process.StartInfo.CreateNoWindow = true;
        this.process.StartInfo.FileName = "lockfile.exe";
        this.process.StartInfo.Arguments =
            "\"" + fileName + "\" " + FileShare.Read.ToString();
        this.process.Start();
    }

    public void UnlockFile()
    {
        this.process.StandardInput.Write('X');
        this.process.StandardInput.Flush();
        this.process.WaitForExit();
        this.process.Close();
    }
}

Когда я вызываю метод LockFile, процесс сразу после запуска завершается.Он не ожидает ввода в UnlockFile.Когда я не перенаправляю стандартный ввод, тогда процесс ожидает ввода с клавиатуры.

Что мне нужно изменить / исправить, чтобы процесс не сразу завершился.Мне нужно, чтобы он дождался ввода, введенного в UnlockFile, и только после этого должен завершиться процесс?

Обновление:

Обновлен, чтобы показать FileLocker класс выше ипредоставить пример звонков ниже:

class Program
{
    static void Main(string[] args)
    {
        FileLocker locker = new FileLocker();
        locker.LockFile("HelloWorld.txt");
        locker.UnlockFile();
    }
}

1 Ответ

1 голос
/ 10 сентября 2011

Возможно, проблема в том, что вы используете Console.ReadKey() в приложении lockfile.exe. Это не принимает ввод от стандартного ввода, но использует зацепки клавиатуры низкого уровня для проверки нажатий клавиш, которые вы не можете отправить из другого приложения.

Я протестировал вашу программу с LockFile.exe, который просто содержал простой Console.ReadLine(), и он работает так же, как и ожидалось, если я изменю вызов Write('X') на WriteLine("X") (поскольку вызов readline требует новой строки перед возвращение). Так что я подозреваю, что ваша проблема в программе lockfile.exe, а не в этой. Убедитесь, что вы используете Console.ReadLine() для ожидания ввода от стандартного ввода в приложении lockfile.exe.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...