如何在没有进程的情况下将StandardInput重定向到进程立即退出?

时间:2011-09-10 14:44:52

标签: c# redirect process

我创建了一个锁定文件lockfile.exe的实用程序,它接受两个参数: fileName (要锁定的文件)和 fileShare (要应用的共享) 。然后我从另一个应用程序中调用此实用程序来测试处理锁定文件时的错误条件。 lockfile.exe实用程序使用指定的共享锁定文件,然后等待任何字符输入释放锁定并退出。

在我的测试应用程序中,我使用两种方法FileLockerLockFile创建了一个类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 个答案:

答案 0 :(得分:1)

问题可能是您在lockfile.exe应用程序中使用Console.ReadKey()。这不接受来自标准输入的输入,但使用低级键盘挂钩来检查您无法从其他应用程序发送的按键。

我使用仅包含简单Console.ReadLine()的LockFile.exe测试了您的程序,如果我将Write('X')调用更改为WriteLine("X"),则可以正常工作(自调用后) readline在返回之前需要换行符。所以我怀疑你的问题是在lockfile.exe程序而不是这个。确保使用Console.ReadLine()等待lockfile.exe应用程序中标准输入的输入。