0

我有我正在打开并在 dist 上创建文件并订阅此过程的过程ProcessExitedEvent

public int InvokeProcess(WiresharkProcesses process, string args)
{
    try
    {
        string processToInvoke = null;
        ProcessStartInfo startInfo = new ProcessStartInfo();
        Process pros = new Process();
        startInfo .FileName = processToInvoke;
        startInfo .RedirectStandardOutput = true;
        startInfo .RedirectStandardError = true;
        startInfo .RedirectStandardInput = true;
        startInfo .UseShellExecute = false;
        startInfo .CreateNoWindow = true;
        startInfo .Arguments = args;
        pros.StartInfo = startInfo ;
        pros.ErrorDataReceived += pros_ErrorDataReceived;
        pros.OutputDataReceived += pros_OutputDataReceived;
        pros.Exited += (object sender, EventArgs e) =>
        {
            if (ProcessExitedEvent != null)
                ProcessExitedEvent(pros.Id);
        };
        pros.EnableRaisingEvents = true;
        pros.Start();
        pros.BeginOutputReadLine();
        pros.BeginErrorReadLine();

        return pros.Id;
    }
    catch (Exception)
    {
        return -1;
    }
}

private void ProcessExitedEvent(int processId)
{
   // Copy file
   // Delete file
}

此过程在磁盘上创建文件,在ProcessExitedEvent事件触发后我想将此文件复制到另一个位置,而不是删除旧文件,但是虽然在进程退出后触发事件,但我的代码未能删除旧文件,因为文件仍在使用所以我想确保我的进程通过使用using block 所以我需要把这个块放在哪里?

4

4 回答 4

4

我非常怀疑using声明是否会有所帮助。Process.Dispose不会杀死其他进程 - 它只是将 CLR 句柄释放给其他进程。(说实话,我不记得每次看到有人使用using声明Process- 不像大多数一次性资源,我不会担心这个。)

我很惊讶您无法删除该文件,但可能是操作系统只是在刷新缓冲区或进程终止时的某些东西。您可能想在删除文件之前尝试等待一秒钟......尽管这实际上不是必需的。您确定不是病毒检查器之类的东西正在拾取文件吗?

于 2013-10-15T15:39:40.537 回答
0

试试这个并告诉我这是否能解决问题:

    public void InvokeProcess(WiresharkProcesses process, string args)
    {
        Task.Factory.StartNew(() =>
        {
            string processToInvoke = null;
            ProcessStartInfo startInfo = new ProcessStartInfo();
            using (Process pros = new Process())
            {
                startInfo.FileName = processToInvoke;
                startInfo.RedirectStandardOutput = true;
                startInfo.RedirectStandardError = true;
                startInfo.RedirectStandardInput = true;
                startInfo.UseShellExecute = false;
                startInfo.CreateNoWindow = true;
                startInfo.Arguments = args;
                pros.StartInfo = startInfo;

                //pros.EnableRaisingEvents = true;

                pros.Start();
                pros.WaitForExit();
            }
            // Copy file
            // Delete file
        });
    }
于 2013-10-15T15:42:18.700 回答
0

我会移动文件而不是复制和删除它。是否有需要复制文件然后删除原始文件的原因?你为什么不移动文件呢?如果它被移动到同一个物理硬盘驱动器上,通常移动它比复制和删除它的成本要低得多,如果不是,你至少仍然可以节省文件操作。

于 2013-10-15T15:41:12.017 回答
0

在我看来,使用这可能是解决您的问题而不是触发事件。我发生了一些事情,我通过使用来解决它WaitForExit()

var process = Process.Start(...);
process.WaitForExit();

// Delete your file.
于 2013-10-15T15:42:09.913 回答