public static FolderInformation CreateCurrent()
        {
            int    waitCount    = 0;
            int    maxWaitCount = 60;
            int    sleepTime    = 1000;
            string newPath      = Path.Combine(AppArguments.CurArgs.BackupPath.FullName, Properties.Settings.Default.BackupSubfolderName);

            while (System.IO.Directory.Exists(newPath))
            {
                if (waitCount > maxWaitCount)
                {
                    throw new Exception(string.Format("Waited for {0} seconds but move of current folder has not finished - aborting procedure.", sleepTime * maxWaitCount / 1000));
                }
                if (waitCount == 0)
                {
                    Console.WriteLine("Need to wait for move complete ...");
                }

                waitCount++;
                System.Threading.Thread.Sleep(sleepTime);
            }

            FolderInformation newCurrent = new FolderInformation(newPath);

            newCurrent.CreateIfNotExist();
            return(newCurrent);
        }
        static void Main(string[] args)
        {
            Console.WriteLine("Starting...");
            try
            {
                CommandLineParser.CommandLineParser parser = new CommandLineParser.CommandLineParser();
                parser.AcceptEqualSignSyntaxForValueArguments = true;
                parser.IgnoreCase  = true;
                parser.AcceptSlash = true;
                parser.AllowShortSwitchGrouping = false;
                parser.ExtractArgumentAttributes(AppArguments.CurArgs);

                try
                {
                    parser.ParseCommandLine(args);
                    parser.ShowParsedArguments();
                }
                catch (CommandLineParser.Exceptions.CommandLineArgumentException cle)
                {
                    Console.WriteLine(string.Format("Invalid command line parameters: {0}", cle.Message));
                    parser.ShowUsage();
                    Environment.ExitCode = 1;
                    return;
                }
                catch (CommandLineParser.Validation.ArgumentConflictException ace)
                {
                    Console.WriteLine(string.Format("Invalid command line parameters: {0}", ace.Message));
                    parser.ShowUsage();
                    Environment.ExitCode = 1;
                    return;
                }

                if (!parser.ParsingSucceeded)
                {
                    Environment.ExitCode = 1;
                    return;
                }
            }
            catch (Exception ex)
            {
                try
                {
                    SQLiteDB.GetInstance(AppArguments.CurArgs.BackupPath.FullName).WriteLog("", string.Format("Unknown commandline parsing error:{0}{1}", Environment.NewLine, ex.ToString()));
                }
                catch { }
                Console.WriteLine(string.Format("Unknown commandline parsing error:{0}{1}", Environment.NewLine, ex.ToString()));
                Environment.ExitCode = 998;
                return;
            }


            try
            {
                // get all sub folders
                List <string> dil = Directory.GetDirectories(AppArguments.CurArgs.BackupPath.FullName, "*", SearchOption.TopDirectoryOnly).ToList();

                // generate list of directory information
                foreach (string di in dil)
                {
                    FolderInfos.Add(new FolderInformation(di));
                }

                // get known folders from db
                DBFolderInfos = SQLiteDB.GetInstance(AppArguments.CurArgs.BackupPath.FullName).GetActiveFolders();

                // check if it is the first run
                if (!FolderInfos.Any(a => a.isBackupFolder))
                {
                    // current folder for backups does not exist - seems to be the first run
                    FolderInfos.Add(CreateCurrent());

                    Console.WriteLine("This is the first run - do nothing then creating the main backup folder!");
                    Environment.ExitCode = 1;
                    return;
                }

                FolderInformation fiCurrent = FolderInfos.First(f => f.isBackupFolder);

                // check if there are files in the folder
                if (!fiCurrent.HasElements())
                {
                    if (AppArguments.CurArgs.IgnoreEmptyTarget)
                    {
                        Console.WriteLine("No files or folders in current directory found - ignore was set so do nothing!");
                        return;
                    }

                    Console.WriteLine("No files or folders in current directory found - cancel operation because nothing has to be done!");
                    Environment.ExitCode = 2;
                }
                else
                {
                    // there are entries insied the current folder - move it and recreate it again
                    Console.WriteLine("Moving current folder to a backup folder");
                    string newName = DateTime.Now.ToString(Properties.Settings.Default.DuplicateDateNaming);

                    // create new location
                    DirectoryInfo newDi = AppArguments.CurArgs.BackupPath.CreateSubdirectory(newName);

                    // move all folders from current location to new one
                    fiCurrent.MoveAllSubElements(newDi);

                    string dbFile = SQLiteDB.GetInstance(AppArguments.CurArgs.BackupPath.FullName).DbPath;

                    try
                    {
                        SQLiteDB.GetInstance(AppArguments.CurArgs.BackupPath.FullName).BackupDatabase(System.IO.Path.Combine(newDi.FullName, System.IO.Path.GetFileName(dbFile)));
                    }
                    catch { }

                    // add folder to db entry
                    SQLiteDB.GetInstance(AppArguments.CurArgs.BackupPath.FullName).AddFolder(newDi.FullName);
                    DBFolderInfos.Add(new FolderInformation(newDi));                     // adding new entry to the database list
                }

                // checking if max folders reached
                int curBackups = DBFolderInfos.Count + 1;                 // +1 because we prepare for the next backup - that why we add one
                if (curBackups > AppArguments.CurArgs.MaxBackups)
                {
                    // we need to delete some backups now
                    foreach (FolderInformation fi in DBFolderInfos.OrderByDescending(o => o.CreationDate).Skip(AppArguments.CurArgs.MaxBackups - 1))
                    {
                        // removing directory
                        Console.WriteLine(string.Format("DELETING: {0}", fi.BaseDirectory.FullName));
                        fi.Delete();
                        SQLiteDB.GetInstance(AppArguments.CurArgs.BackupPath.FullName).RemFolder(fi.BaseDirectory.Name);
                        SQLiteDB.GetInstance(AppArguments.CurArgs.BackupPath.FullName).WriteLog(fi.BaseDirectory.Name, "Folder successfully deleted.");
                    }
                }
            }
            catch (Exception ex)
            {
                try
                {
                    SQLiteDB.GetInstance(AppArguments.CurArgs.BackupPath.FullName).WriteLog("", string.Format("Unknown error:{0}{1}", Environment.NewLine, ex.ToString()));
                }
                catch { }
                Console.WriteLine(string.Format("Unknown error:{0}{1}", Environment.NewLine, ex.ToString()));
                Environment.ExitCode = 999;
                return;
            }
        }