Saif Ahsanullah
Saif Ahsanullah

Reputation: 204

exiting console application c# and writing to log

So I'm trying to exit a console application IF a parameter check fails, however, I still want it to log to a file. The logging to a file works fine as long as all the parameters are good. However, when a parameter check fails and hits the System.Environment.Exit(0) portion, the log file is still completely empty. Here's the code so far. Please help, I've tried everything I could think of.

    using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.IO;

namespace I2C_File_Splitter
{
    class Program
    {
        static void Main(string[] args)
        {
            //get command line input paramaters  

            using (StreamWriter log = File.AppendText("Splitter_log.txt"))
            {


                log.WriteLine(DateTime.Now + " ******************************************** SPLITTER STARTED ****************************************************************");
                log.WriteLine(DateTime.Now + " FILE: " + args[0] + " DESTINATION: " + args[1] + " MAX COUNT PER FILE: " + args[2]);


                if (args.Length == 0)
                    System.Environment.Exit(0);


                string originalFile = args[0];

                string destination = args[1];
                int fileLength = Convert.ToInt32(args[2]);
                string fileName;
                string fileExtension;
                string line;
                int fileNumber = 1;




                if (!File.Exists(originalFile))
                {
                    log.WriteLine(DateTime.Now + " Error: Transfund file not found for: " + args[0]);
                    log.WriteLine(DateTime.Now + " ******************************************** SPLITTER ENDED ****************************************************************");
                    System.Environment.Exit(0);

                }


                if (!Directory.Exists(destination))
                {
                    log.WriteLine(DateTime.Now + " Error: destination directory not found for: " + args[1] );
                    log.WriteLine(DateTime.Now + " ******************************************** SPLITTER ENDED ****************************************************************");
                    System.Environment.Exit(0);
                }


                if (fileLength < 0)
                {
                    log.WriteLine(DateTime.Now + " Error: file length must be greater than 0. Incorrect value " + args[2]);
                    log.WriteLine(DateTime.Now + " ******************************************** SPLITTER ENDED ****************************************************************");
                    System.Environment.Exit(0);
                }


                //get file name and file extension
                fileName = Path.GetFileNameWithoutExtension(originalFile);
                fileExtension = Path.GetExtension(originalFile);



                StreamReader file = new StreamReader(originalFile);

                log.WriteLine(DateTime.Now + " processing: " + fileName); 

                string header = file.ReadLine(); //get first line

                while ((line = file.ReadLine()) != null)
                {
                    StreamWriter newFile = new StreamWriter(destination + "\\" + fileName + "_" + fileNumber.ToString() + fileExtension);
                    newFile.WriteLine(header);
                    newFile.WriteLine(line);

                    int counter = 1;
                    while (counter < fileLength)
                    {
                        line = file.ReadLine();

                        if (line == null)
                            break;

                        newFile.WriteLine(line);
                        counter++;

                    }
                    newFile.Close();
                    log.WriteLine(DateTime.Now + " " + fileName + "_" + fileNumber.ToString() + fileExtension + " created. Card count: " + counter);
                    fileNumber++;
                }

                log.WriteLine(DateTime.Now + " Processing completed: " + fileName);
                log.WriteLine(DateTime.Now + " ******************************************** SPLITTER ENDED ****************************************************************");
            }
        }
    }
}

Upvotes: 0

Views: 2400

Answers (1)

Grant Winney
Grant Winney

Reputation: 66449

When you call Environment.Exit, you're telling it to terminate your program immediately.

Your "log" stream never gets flushed (which would happen when you reach the end of the using block), and so nothing gets a chance to be written to the file.

Try flushing the stream before calling exit.

if (!Directory.Exists(destination))
{
    log.WriteLine(DateTime.Now + " Error: destination directory not found for: " + args[1] );
    log.WriteLine(DateTime.Now + " ******************************************** SPLITTER ENDED ****************************************************************");

    // write all pending log messages to the file
    log.Flush();

    System.Environment.Exit(0);
}

Upvotes: 5

Related Questions