【发布时间】:2011-11-14 09:46:50
【问题描述】:
我创建了一个工具来锁定文件lockfile.exe,它接受两个参数:fileName(要锁定的文件)和fileShare(要应用的共享)。然后,我从另一个应用程序中调用此实用程序来测试处理锁定文件时的错误情况。 lockfile.exe 实用程序锁定具有指定共享的文件,然后等待任何字符输入以释放锁定并退出。
在我的测试应用程序中,我使用两个方法 LockFile 和 UnlockFile 创建了一个类 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();
}
}
【问题讨论】:
-
你能说明你是如何调用
LockFile和UnlockFile方法的吗? -
@ChrisF:请查看更新后的帖子。
-
我使用仅包含一个简单 Console.ReadLine() 的 LockFile.exe 测试了您的程序,如果我将 Write('X') 调用更改为 WriteLine(" X”)。所以我怀疑你的问题出在 lockfile.exe 程序而不是这个程序中。您如何等待 LockFile.exe 中的按键(或输入)? (请注意,Console.ReadKey() 可能不起作用,因为它不通过标准输入流来检测输入)
-
如果你想锁定一个文件,你为什么不这样做呢?无需外部过程。这只会让生活变得艰难,应用程序也变得脆弱。
-
David 说的很对,Windows 不在乎哪个进程锁定了文件。直接打开文件就行了。是的,你也可以把自己锁在外面。锁属于文件句柄,而不是进程。