Esempio n. 1
0
        private void btnGo_Click(object sender, EventArgs e)
        {
            if (origfile == null || newfile == null || txtTol.Text == "" || lbxCols.SelectedItems.Count == 0)
            {
                MessageBox.Show("Invalid inputs, please make sure 2 files are specified, at least 1 column is selected and some kind of 'Tolerance' is specified");
                return;
            }

            if (txtTol.Text == "0" && !radDP.Checked)
            {
                if (MessageBox.Show("Tolerance entered is exclusive upper bound, therefore entering a value of '0' may cause every single comparison to fail\r\nContinue?", "Warning", MessageBoxButtons.YesNo) == DialogResult.No)
                {
                    return;
                }
            }

            StringBuilder sb = new StringBuilder();

            try
            {
                Differ.Diff(
                    origfile,
                    newfile,
                    lbxCols.SelectedItems.Cast <string>().ToList(),
                    decimal.Parse(txtTol.Text),
                    radAbs.Checked ?
                    DiffMethod.abs :
                    radDP.Checked ?
                    DiffMethod.dp :
                    DiffMethod.pct,
                    ref sb
                    );

                string[] s;

                rtxtOutput.Text = sb.ToString();
            }
            catch (Exception ex)
            {
                MessageBox.Show("ERROR - Please check output text box for details");
                rtxtOutput.Text = sb.ToString() + Environment.NewLine + ex.Message + Environment.NewLine + ex.StackTrace;
            }
        }
        /// <summary>
        /// Actually run the Differ using the arguments provided to the constructor
        /// </summary>
        /// <returns>The number of files that failed diffs</returns>
        public int Run()
        {
            //load our inputs into Dictionairies.  'Key' is Path.FileNameWithoutExtension('Value')
            //'Pairify' matches the a and b dictionary keys up, returning a dictionary with 'b' keys as the 'Key's and 'a' keys as
            //the 'Value's (this is how we figure out which files to diff against)
            Dictionary <string, string>
            a         = Dictionaryify(getFiles(args.A, args.Filter)),
                b     = Dictionaryify(getFiles(args.B, args.Filter)),
                pairs = Pairify(a, b);

            int  bad_result          = 0;
            bool report_individually = report == null;

            //process the files
            foreach (KeyValuePair <string, string> pair in pairs)
            {
                bool reported = false;

                //stringbuilder used for reporting
                StringBuilder info = new StringBuilder();
                try
                {
                    //append file names in the order 'new' then 'orig'
                    info.AppendFormat("{0}\t{1}\t", b[pair.Key], a[pair.Value]);

                    //load our files into a form where the differ can recognise them
                    InputFile
                        f_orig = new InputFile(a[pair.Value]),
                        f_new  = new InputFile(b[pair.Key]);

                    //diff the files, if there are any errors it will return 'false' (StringBuilder 'info' is passed in by ref here for reporting purposes)
                    //note that all common columns will be diffed
                    if (!Differ.Diff(f_orig, f_new, Differ.GetCommonColNames(f_orig, f_new), args.Tolerance, args.Method, ref info))
                    {
                        //if we failed then increment our total fails
                        bad_result++;

                        //let 'finally' know we want to report a fail
                        reported = true;
                    }
                }
                catch (Exception e)
                {
                    //if there was an exception for this file then report it as a failed diff
                    bad_result++;
                    info.AppendFormat("ERROR\t{0}\n{1}\n", e.Message, e.StackTrace);
                    reported = true;
                }
                finally
                {
                    //if reporting individually, only report if there was an error (easier to tell which files failed then becasue they will the the only ones with logs)
                    if (report_individually && reported)
                    {
                        if (args.Output != null)
                        {
                            using (report = new StreamWriter(Path.Combine(args.Output, pair.Key + ".txt")))
                                report.Write(info.ToString());
                        }
                        else
                        {
                            using (report = new StreamWriter(b[pair.Key] + ".txt"))
                                report.Write(info.ToString());
                        }
                    }

                    //if not reporting individually the write 'info' to the log file regardless of whetehr it passed or failed
                    else if (!report_individually)
                    {
                        report.WriteLine(info.ToString());
                    }
                }
            }

            report.Close();
            return(bad_result);
        }