Googler

两情相悦,又岂在朝朝暮暮。

C# NamedPipe

代码监听端
using System;
using System.IO;
using System.IO.Pipes;
using System.Threading;
using System.Diagnostics;
using System.Collections.Generic;
using System.Text;

namespace Protector
{
public class Protector
{
private Thread serverThread;
private Dictionary<string, Process> dict;
private Timer timer;

public Protector()
{
serverThread
= new Thread(() =>
{
while (true)
{
using (NamedPipeServerStream pipeServer = new NamedPipeServerStream("ProtectorPipe", PipeDirection.In))
using (BinaryReader reader = new BinaryReader(pipeServer))
{
pipeServer.WaitForConnection();
string value = reader.ReadString();
Console.WriteLine(value);
RegisterProcess(value);
pipeServer.Disconnect();
}
}
});
serverThread.IsBackground
= true;
serverThread.Start();
}

public void RegisterProcess(string filePath)
{
if (File.Exists(filePath))
{
if (dict == null)
{
dict
= new Dictionary<string, Process>(1);
timer
= new Timer(CheckProcess, null, 200, 200);
}
if (!dict.ContainsKey(filePath))
{
dict.Add(filePath, GetProcess(filePath)
?? new Process());
}
}
}
private void CheckProcess(object obj)
{
foreach (KeyValuePair<string, Process> pair in dict)
{
string filePath = pair.Key;
if (GetProcess(filePath) == null)
{
Process processObj
= pair.Value;
processObj.StartInfo.FileName
= filePath;
processObj.EnableRaisingEvents
= true;
processObj.Exited
+= new EventHandler(processObj_Exited);
processObj.Start();
Thread.Sleep(
0x7d0);
}
}
}
private void processObj_Exited(object sender, EventArgs e)
{
Process processObj
= (Process)sender;
try
{
processObj.WaitForExit();
}
finally
{
string filePath = processObj.StartInfo.FileName;
if (GetProcess(filePath) == null)
{
processObj.Refresh();
processObj.StartInfo.FileName
= filePath;
processObj.EnableRaisingEvents
= true;
processObj.Exited
+= new EventHandler(processObj_Exited);
processObj.Start();
Thread.Sleep(
0x7d0);
}
}
}

public Process GetProcess(string filePath)
{
Process[] p
= Process.GetProcessesByName(Path.GetFileNameWithoutExtension(filePath));
return p.Length > 0 ? p[0] : null;
}
}
}

 

调用方法
public static bool TryProtectProcess(string filePath)
{
Guard
<FileNotFoundException>(!File.Exists(filePath), "filePath");
try
{
using (NamedPipeClientStream pipeClient = new NamedPipeClientStream(".", "ProtectorPipe", PipeDirection.Out))
using (BinaryWriter writer = new BinaryWriter(pipeClient))
{
pipeClient.Connect(
1000);
writer.Write(filePath);
writer.Flush();
}
return true;
}
catch (TimeoutException)
{
return false;
}
catch
{
throw;
}
}

 

posted on 2010-08-12 13:46  RockyLOMO  阅读(2478)  评论(0编辑  收藏  举报

导航

Apple/苹果笔记本 Mac Air MC968CH/A 行货在保 I5 11寸 超级本