简体   繁体   中英

How do I test in C# if an exe is running correctly?

I have a viewer.exe that loads at startup some models ( *.mdl ) from a "models" folder. Some of the models crash viewer.exe : "viewer.exe has stopped working. Windows can check online for a solution to the problem".
What I could do is move all the .mdl files in a "source" folder and then manually test for each .mdl file moved to "models" if viewer.exe is running but, there are a lot of files to check. How do I move each *.mdl file from "source" to "models" and test programmatically if viewer.exe is running correctly?

Here is the code I use for my first problem: to move the .mdl files from "source" folder sub-directories in "models". Some of the files had identical names but different size:

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);
        }
    }
}

use process.start(startInfo) (see http://msdn.microsoft.com/en-gb/library/0w4h05yb.aspx )

Wait a few seconds, check if the process has terminated, then the returned process.hasexited ( http://msdn.microsoft.com/en-us/library/system.diagnostics.process.hasexited.aspx )

then kill it anyway using process.kill() (see http://msdn.microsoft.com/en-us/library/system.diagnostics.process.kill.aspx )

You might need to turn off windows error reporting: http://msdn.microsoft.com/en-us/library/bb513638(VS.85).aspx

Surround the operations which can fail in try-catch statements

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
}

In the catch statement do whatever you want to do in case the files could not be processed.

I have disabled windows error reporting and this is how the program looks like now:

        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();
        }
       }

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM