如何在C#中测试exe是否正确运行

本文关键字:是否 运行 exe 测试 | 更新日期: 2023-09-27 17:58:28

我有一个viewer.exe,它在启动时从"models"文件夹加载一些模型(*.mdl)。某些模型崩溃viewer.exe:"viewer.exe已停止工作。Windows可以联机检查问题的解决方案"
我可以做的是将所有.mdl文件移动到"源"文件夹中,然后手动测试移动到"模型"中的每个.mdl文件(如果viewer.exe正在运行),但有很多文件需要检查。如何将每个*.mdl文件从"源"移动到"模型",并以编程方式测试viewer.exe是否正确运行?

以下是我用于解决第一个问题的代码:从"模型"中的"源"文件夹子目录中移动.mdl files。有些文件的名称相同,但大小不同:

String mask = "*.mdl";
String source = @"c:'Source'";
String destination = @"c:'Models'";
String[] files = Directory.GetFiles(source, mask, SearchOption.AllDirectories);
foreach (String file in files)
{
    if (File.Exists(file) && !File.Exists(destination + new FileInfo(file).Name))
    {
        File.Move(file, destination + new FileInfo(file).Name);
    }
    else
    {
        FileInfo f = new FileInfo(file);
        long s = f.Length;
        FileInfo f2 = new FileInfo(destination + new FileInfo(file).Name);
        long s2 = f2.Length;
        if (s >= s2)
        {
            File.Delete(destination + new FileInfo(file).Name);
            File.Move(file, destination + new FileInfo(file).Name);
        }
    }
}

如何在C#中测试exe是否正确运行

使用process.start(startInfo)(请参阅http://msdn.microsoft.com/en-gb/library/0w4h05yb.aspx)

等待几秒钟,检查进程是否已终止,然后返回进程。hasexited(http://msdn.microsoft.com/en-us/library/system.diagnostics.process.hasexited.aspx)

然后使用process.kill()杀死它(请参阅http://msdn.microsoft.com/en-us/library/system.diagnostics.process.kill.aspx)

您可能需要关闭窗口错误报告:http://msdn.microsoft.com/en-us/library/bb513638(VS.85).aspx

环绕try-catch语句中可能失败的操作

try {
    File.Delete(destination + new FileInfo(file).Name);
} catch (Exception ex) {
    // File could not be deleted
}
try {
    File.Move(file, destination + new FileInfo(file).Name);
} catch (Exception ex) {
    // File could not be moved
}

在catch语句中,如果无法处理文件,请执行您想做的任何操作。

我已经禁用了windows错误报告,这就是程序现在的样子:

        String mask = "*.mdl";
        String source = @"c:'source'";
        String destination = @"C:'Viewer'Models'";
        String[] files = Directory.GetFiles(source, mask, SearchOption.AllDirectories);
       foreach (String file in files)
       {
           if (File.Exists(file) && !File.Exists(destination + new FileInfo(file).Name))
           {
               File.Move(file, destination + new FileInfo(file).Name);
           }
           else
           {
               FileInfo f = new FileInfo(file);
               long s = f.Length;
               FileInfo f2 = new FileInfo(destination + new FileInfo(file).Name);
               long s2 = f2.Length;
               if (s >= s2)
               {
                   File.Delete(destination + new FileInfo(file).Name);
                   File.Move(file, destination + new FileInfo(file).Name);
               }
           }
    //mycompiledapp.exe is placed in Viewer folder for this to work
        Process myprocess = Process.Start(@"viewer.exe"); 
        Thread.Sleep(3000);
        if (myprocess.HasExited) //Process crashes, exiting automatically
        {
    //Deletes the file that makes the viewer.exe crash
            File.Delete(destination + new FileInfo(file).Name); 
        }
        else
        {
            myprocess.Kill();
        }
       }