2011-09-10 57 views
0

我創建了一個實用程序來鎖定文件lockfile.exe,它接受兩個參數:文件名(要鎖定的文件)和fileShare(要應用的共享)。然後我從另一個應用程序中調用該實用程序來測試處理鎖定文件時的錯誤條件。 lockfile.exe實用程序會鎖定具有指定共享的文件,然後等待任何字符輸入以釋放鎖定並退出。如何重定向StandardInput進程沒有進程立即退出?

在我的測試應用程序,我創建了一個類FileLocker兩種方法LockFileUnlockFile如下:

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

你能告訴你如何調用'LockFile'和'UnlockFile'方法。 – ChrisF

+0

@ChrisF:請參閱更新後的帖子。 – Elan

+1

我用一個包含一個簡單的Console.ReadLine()的LockFile.exe測試了你的程序,並且如果我改變Write('X')調用WriteLine(「X」),它就像預期的那樣工作。所以我懷疑你的問題是在lockfile.exe程序而不是這個。你如何等待LockFile.exe中的按鍵(或輸入)? (請注意,Console.ReadKey()可能不起作用,因爲它沒有通過標準輸入流來檢測輸入) – DeCaf

回答

1

的問題很可能是你在你的lockfile.exe應用程序中使用Console.ReadKey()。這不接受來自標準輸入的輸入,而是使用低級別鍵盤掛鉤來檢查無法從其他應用程序發送的按鍵。

我只是包含一個簡單的Console.ReadLine()一個LockFile.exe測試你的程序,和它的作品,如果我改變Write('X')呼叫到WriteLine("X")(因爲調用的ReadLine需要返回前一個換行符),正如預期。所以我懷疑你的問題是在lockfile.exe程序而不是這個。確保您正在使用Console.ReadLine()等待來自lockfile.exe應用程序的標準輸入的輸入。