【问题标题】:How redirect StandardInput on Process without process immediately exiting?如何在进程不立即退出的情况下重定向标准输入?
【发布时间】:2011-11-14 09:46:50
【问题描述】:

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

在我的测试应用程序中,我使用两个方法 LockFileUnlockFile 创建了一个类 FileLocker,如下所示:

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();
    }
}

【问题讨论】:

  • 你能说明你是如何调用LockFileUnlockFile方法的吗?
  • @ChrisF:请查看更新后的帖子。
  • 我使用仅包含一个简单 Console.ReadLine() 的 LockFile.exe 测试了您的程序,如果我将 Write('X') 调用更改为 WriteLine(" X”)。所以我怀疑你的问题出在 lockfile.exe 程序而不是这个程序中。您如何等待 LockFile.exe 中的按键(或输入)? (请注意,Console.ReadKey() 可能不起作用,因为它不通过标准输入流来检测输入)
  • 如果你想锁定一个文件,你为什么不这样做呢?无需外部过程。这只会让生活变得艰难,应用程序也变得脆弱。
  • David 说的很对,Windows 不在乎哪个进程锁定了文件。直接打开文件就行了。是的,你也可以把自己锁在外面。锁属于文件句柄,而不是进程。

标签: c# redirect process


【解决方案1】:

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

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

【讨论】:

  • 10 多岁,仍然救了我的命。我还有一个问题,如果我这样做,我想重定向标准输入(过去称为 ReadKey)的子进程总是在启动后消失。你知道为什么(如果你还在的话)?
  • 很遗憾没有更多信息。但很高兴我能帮上忙……十年前。 :D
猜你喜欢
  • 1970-01-01
  • 2013-03-13
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-01-10
  • 2017-05-21
  • 1970-01-01
相关资源
最近更新 更多