//fi: fileinfo of a single file (path, and so on..)
        public static bool readExcelFile(FileInfo fi, string dstpath, ExcelObj dst, int count)
        {
            string filePath = "not initialized";
            int    internalCount;
            Dictionary <string, string> sysInfo;
            ExcelObj src = null;

            try
            {
                //full path of a xlsx file
                filePath      = fi.FullName;
                internalCount = 1;
                Console.WriteLine(filePath);

                sysInfo = new Dictionary <string, string>();

                src = new ExcelObj(filePath, false);
                Console.WriteLine("Rows: " + src.row + ", Column: " + src.column);

                #region readingSysInfo

                //reading everything that is on these fixed cells (most of the time)

                sysInfo.Add("IP-Name", src.getValue(1, 1));

                sysInfo.Add("Benutzer", src.getValue(8, 1));

                sysInfo.Add("CPU", src.getValue(3, 1));

                sysInfo.Add("Typenbezeichner", src.getValue(5, 1));

                sysInfo.Add("Seriennummer", src.getValue(10, 1));

                sysInfo.Add("Massenspeicher", src.getValue(12, 1) + " " + src.getValue(14, 1));


                /*
                 * sysInfo.Add("IP-Adresse", src.getValue(28, 1));
                 */

                //filtering ip adress -> not in the same cell every time
                string value = "empty";
                for (int i = 20; i <= 40; i++)
                {
                    value = src.getValue(i, 1);

                    if (value != null)
                    {
                        //looking for possible ip adresses
                        if (value.Contains("IPv4-Adresse") && (value.Contains("192.") || value.Contains("169.") || value.Contains("10.")))
                        {
                            //trimming ip adress, neccessary because a lot of useless information is attached here
                            value = src.getValue(i, 1);
                            string[] seperator = new string[1];
                            seperator[0] = ":";
                            string[] trimmed = value.Split(seperator, StringSplitOptions.RemoveEmptyEntries);

                            value = trimmed[1];
                            break;
                        }
                    }
                    else
                    {
                        value = null;
                    }
                }
                sysInfo.Add("IP-Adresse", value);

                #endregion

                //writing to the console every read info, debug purposes
                foreach (KeyValuePair <string, string> kvp in sysInfo)
                {
                    if (kvp.Key != null && kvp.Value != null)
                    {
                        Console.WriteLine(kvp.Key + ", " + kvp.Value);
                    }
                }
                //free excel and free resources
                //src.Free(true);

                #region saving in Summary
                //save to big summary
                //IP-Name
                //validating everything and writing it into the summary excel
                Console.WriteLine(dst.row + 1);
                if (sysInfo["IP-Name"] != null)
                {
                    //writing to excel
                    Console.WriteLine("Saved IP-name");
                    dst.saveValue(dst.row + 1, 9, sysInfo["IP-Name"]);
                }
                else
                {
                    //writing none to excel
                    dst.saveValue(dst.row + 1, 9, "none");
                }
                //CPU
                if (sysInfo["CPU"] != null)
                {
                    Console.WriteLine("Saved CPU");
                    dst.saveValue(dst.row + 1, 10, sysInfo["CPU"]);
                }
                else
                {
                    dst.saveValue(dst.row + 1, 10, "none");
                }
                //Typenbezeichner
                if (sysInfo["Typenbezeichner"] != null)
                {
                    Console.WriteLine("Saved typenbezeichner");
                    dst.saveValue(dst.row + 1, 7, sysInfo["Typenbezeichner"]);
                }
                else
                {
                    dst.saveValue(dst.row + 1, 7, "none");
                }
                //Benutzer
                if (sysInfo["Benutzer"] != null)
                {
                    Console.WriteLine("Saved Benutzer");
                    dst.saveValue(dst.row + 1, 4, sysInfo["Benutzer"]);
                }
                else
                {
                    dst.saveValue(dst.row + 1, 4, "none");
                }
                //Seriennummer
                if (sysInfo["Seriennummer"] != null)
                {
                    Console.WriteLine("Saved Seriennummer");
                    dst.saveValue(dst.row + 1, 8, sysInfo["Seriennummer"]);
                }
                else
                {
                    dst.saveValue(dst.row + 1, 8, "none");
                }
                //Massenspeicher
                if (sysInfo["Massenspeicher"] != null)
                {
                    Console.WriteLine("Saved massenspeicher");
                    dst.saveValue(dst.row + 1, 12, sysInfo["Massenspeicher"]);
                }
                else
                {
                    Console.WriteLine("no mass storage");
                    dst.saveValue(dst.row + 1, 12, "none");
                }
                //IP-Adresse
                if (sysInfo["IP-Adresse"] != null)
                {
                    dst.saveValue(dst.row + 1, 13, sysInfo["IP-Adresse"]);
                }
                else
                {
                    Console.WriteLine("no ip adress");
                    dst.saveValue(dst.row + 1, 13, "none");
                }

                dst.IncrementRow();
                #endregion

                internalCount++;
                return(true);
            }
            catch (Exception ex)
            {
                errorCount++;
                errorFiles[errorCount] = filePath;

                /*
                 * if(src != null)
                 * {
                 *  Console.WriteLine("tried to error free");
                 *  src.Free(true);
                 * }
                 */
                Console.WriteLine("Error Single Read and Save, " + ex.Message);
                Console.WriteLine("error file: " + filePath);
            }
            finally
            {
                if (src != null)
                {
                    Console.WriteLine("trying to free single read");
                    src.Free(true);
                }
            }
            return(false);
        }
        //src: file path where the path for the source excel files is saved
        //dst: file path where the path for the destination excel file is saved
        public static bool readAndWriteExcelFiles(string src, string dst)
        {
            successful = 0;
            count      = 0;
            ExcelObj dstExcel = null;

            errorFiles = new string[10];
            try
            {
                //checking if both paths were entered
                if (src == null || dst == null)
                {
                    return(false);
                }

                //get all the .xlsx files in the folder
                DirectoryInfo d;
                FileInfo[]    files;
                try
                {
                    //getting every excel file needed
                    d          = new DirectoryInfo(src);
                    files      = d.GetFiles("*.csv");
                    errorFiles = new string[files.Count <FileInfo>()];
                }
                catch (Exception ex)
                {
                    Console.WriteLine(ex.Message);
                    Console.WriteLine("error while scanning direcotry");
                    return(false);
                }

                count = files.Count <FileInfo>();

                //open Destination excel file
                dstExcel = new ExcelObj(getDstPath(), true);
                int oldRow = dstExcel.row;

                foreach (FileInfo file in files)
                {
                    //send each file to reader function
                    if (readExcelFile(file, dst, dstExcel, count))
                    {
                        successful++;
                    }
                }

                //release every process needed for the destination excel
                dstExcel.deleteCells(oldRow);

                Console.WriteLine();
                Console.WriteLine("Error trying to read these Files: ");
                foreach (string errorfile in errorFiles)
                {
                    //writing every failed excel file to the console
                    if (errorfile != null)
                    {
                        Console.WriteLine(errorfile);
                    }
                }
                Console.WriteLine();
                Console.WriteLine(successful + " of " + count + " have been read and re-saved");
                Console.WriteLine("Hit save on the Windows Save Prompt to continue. (if you dont see it use alt+tab to look for it)");
            }
            catch (Exception ex)
            {
                Console.WriteLine(ex.Message);
                Console.WriteLine(errorFiles.Count <string>());
                Console.WriteLine("Big error");
            }
            finally
            {
                if (dstExcel != null)
                {
                    Console.WriteLine("trying to free data collection excel");
                    dstExcel.Free(true);
                }
            }
            return(true);
        }