Zachieve Low-Impact Reuse: C# : Add Command-Line Parameters: Listing 2

Adding new features means adding command line parameters to specify what needs to be done. This version of ClipboardWriter includes the code to process command-line parameters. Every console application will use some command-line parameters, so this is an excellent candidate to create some reusable components.

/// <summary>
/// Clipboard Writer class.
/// </summary>
class ClipboardWriter
{
    public bool Silent
    {
        get;
        set;
    }

    public TextReader InputStream
    {
        get;
        set;
    }

    public string OutputFile
    {
        get;
        set;
    }

    public ClipboardWriter()
    {
        InputStream = Console.In;
    }

    private void processStream()
    {
        System.Text.StringBuilder allStrs = 
           new System.Text.StringBuilder();
        string str;
        while (null != (str = InputStream.ReadLine()))
        {
            // Store it:
            allStrs.Append(str);
            allStrs.Append("\r\n");
            // Pipe it to the output:
            if (!Silent)
                System.Console.WriteLine(str);
        }
        if (!string.IsNullOrEmpty(OutputFile))
        {
            TextWriter tOut = new System.IO.StreamWriter(
				     OutputFile);
            tOut.Write(allStrs.ToString());
            tOut.Close();
        }
        System.Windows.Forms.Clipboard.SetDataObject(
          allStrs.ToString(), true);
    }

    /// <summary>
    /// The main entry point for the application.
    /// </summary>
    [STAThread]
    static void Main(string[] args)
    {
        // Create the processor
        ClipboardWriter processor = new ClipboardWriter();
        // Handle all parameters
        for (int i = 0; i < args.Length; i++ )
        {
            string standardArg = args[i].ToLower();
            if (standardArg == "-s")
                processor.Silent = true;
            else if (standardArg == "-w")
            {
                i++;
                string outputFile = args[i];
                string dir = Path.GetDirectoryName(outputFile);
                if ((!string.IsNullOrEmpty(dir))
                    && (!Directory.Exists(dir)))
                {
                    Console.Error.WriteLine(
                        "Error:  Specified Output Directory 
                        doesn't exist");
                    return;
                }
                processor.OutputFile = outputFile;
            }
            else if (standardArg == "-r")
            {
                i++;
                string fName = args[i];
                if (File.Exists(fName))
                {
                    processor.InputStream = new
                       StreamReader(fName);
                }
                else
                {
                    Console.Error.WriteLine(
                       "Error: Input file does not exist");
                    return;
                }
            }
            else
            {
                Console.Error.WriteLine("Invalid Input");
                return;
            }
        }
        // Do the work
        processor.processStream();
    }
}
comments powered by Disqus
Upcoming Events

.NET Insight

Sign up for our newsletter.

I agree to this site's Privacy Policy.