共享网络文件以进行读写

时间:2018-09-05 08:38:20

标签: c# .net wmi io-redirection processstartinfo

我有在C#.NET 3.5中开发的客户端-服务器应用程序。该应用程序使用3个程序来完成所需的工作。进程A(服务器)和进程B(远程启动器)是在.NET中开发的,进程C是第三方控制台应用程序,其开发语言未知。使用远程计算机的管理凭据,进程A在其上复制进程B,并将进程B安排为远程计算机上的任务。此后,进程B由任务计划程序启动,并创建log.txt文件来记录消息。然后,进程B使用Process.Start()语义启动进程C,并重定向其standard output and error写入log.txt文件。进程A使用Process.GetProcesses(remotecomputername)语义来监视进程C是否仍在远程计算机上运行。 进程A还使用类似于log.txt的网络共享读取\\RemoteComputerName\C$\RemoteDir\log.txt文件,并在其窗口中显示消息。

我的问题是,所有输出和错误都未登录log.txt。并且进程A无法从log.txt正确读取。如果使用DebugView记录了输出/错误,则说明它们已正确记录。是否存在同步/访问权限问题?如何摆脱它? 任何指针/提示将是真正有价值的。由于限制,无法共享完整代码。

下面提供了示例代码

过程A

//Below method is called every 2 seconds from Server to read new messages.
//path passed as `\\RemoteComputerName\C$\RemoteDir\log.txt`
private void ReadRemoteLog(string path)
{
    try
    {
        string[] lines = File.ReadAllLines(path);
        while (RemoteLogPosition < lines.LongLength)
        {
            string msg = lines[RemoteLogPosition].Trim();
            if (!string.IsNullOrEmpty(msg))
            {
                Trace.WriteLine("# " +msg); //Writing on DebugView
                OnProgressChanged(msg);
            }
            RemoteLogPosition++; //This is global variable to keep track of last read position.
        }      
    }   
}

进程B的启动进程C的代码

ProcessStartInfo ps = new ProcessStartInfo();
ps.UseShellExecute = false;
ps.FileName = <Path to process C>;
ps.Arguments = <Commandline args to Process C>;
ps.WorkingDirectory = @"C:\RemoteDir";
ps.RedirectStandardError = true;
ps.RedirectStandardOutput = true;

Process p = new Process();
p.StartInfo = ps;

p.OutputDataReceived += (s, e) => { WriteLog(e.Data.Trim());};
p.ErrorDataReceived += (s, e) => { WriteLog(e.Data.Trim()); };
p.Start();
p.BeginOutputReadLine();
p.BeginErrorReadLine();
WriteLog("Process Started - "+ps.FileName + ps.Arguments);
p.WaitForExit();

进程B的WriteLog方法-

private void WriteLog(string message)
{
    using (FileStream fs = new FileStream(@"C:\\RemoteDir\log.txt", FileMode.OpenOrCreate, FileAccess.Write, FileShare.Inheritable))
    using(StreamWriter sw = new StreamWriter(fs))
    {
        sw.WriteLine("#" + message);
    }
}

1 个答案:

答案 0 :(得分:1)

记住文件在写入时会获得排他锁。 因此,如果两个线程同时写入,则其中一个将陷入异常。 阅读不是问题。 简单的解决方案是制作多个日志文件或使用数据库。 另一种方法是保持消息累积并在一个小时内或消息达到100条时写入一次。 列出字符串

def my_view(request):
    return render(request,
                  'your-template.html',
                   context=your_context,
                   status=204) # your custom status in this case 204

另一种方法是异步写入。 您可能会丢失顺序。

List<string> messagelst= new List<string>();
private void WriteLog(string message)
{


        messagelst.Add("New York");
        messagelst.Add("Mumbai");
        messagelst.Add("Berlin");
        messagelst.Add("Istanbul");
if(messagelst.length==100){
string message= string.Join(",", messagelst.ToArray());

    using (FileStream fs = new FileStream(@"C:\\RemoteDir\log.txt", FileMode.OpenOrCreate, FileAccess.Write, FileShare.Inheritable))
    using(StreamWriter sw = new StreamWriter(fs))
    {
        sw.WriteLine("#" + message);
    }

messagelst= new List<string>();

}
}