/// <summary>
        /// Read a single file
        /// </summary>
        /// <param name="FilesList"></param>
        /// <param name="directory"></param>
        /// <param name="FileNumberID"></param>
        /// <param name="startDate"></param>
        /// <param name="endDate"></param>
        /// <param name="percentIncrease"></param>
        /// <param name="dateType"></param>
        /// <param name="lookForDates"></param>
        /// <param name="directoryLoadPercentage"></param>
        /// <param name="GenerateMD5"></param>
        /// <param name="getConents"></param>
        /// <param name="IncludeExtensions"></param>
        /// <param name="ExcludeExtensions"></param>
        /// <param name="fileSizeStart"></param>
        /// <param name="fileSizeEnd"></param>
        /// <param name="FileSizeType"></param>
        /// <param name="flash"></param>
        /// <returns></returns>
        public ListOfFiles <FileStructure> getFile(
            ListOfFiles <FileStructure> FilesList,
            string directory,
            ref long FileNumberID,
            DateTime startDate,
            DateTime endDate,
            ref float percentIncrease,
            int dateType                  = -1,
            bool lookForDates             = false,
            float directoryLoadPercentage = 0,
            bool GenerateMD5              = false,
            bool getConents               = false,
            string[] IncludeExtensions    = null,
            string[] ExcludeExtensions    = null,
            int fileSizeStart             = -1,
            int fileSizeEnd               = -1,
            int FileSizeType              = -1
            )
        {
            //decimal progressPercent = 100 / (decimal)directories.Count; // per folder percentage
            //decimal percentIncrease = 0;
            //directories
            //    .AsParallel()
            //    .WithDegreeOfParallelism(20)
            //    .ForAll(directory => {
            //        //counting all files number
            //        filesCount += Directory.GetFiles(directory).Count();
            //    });
            EncryptionGenerate md5 = null;

            if (GenerateMD5)
            {
                md5 = new EncryptionGenerate();
            }



            var files = Directory.GetFiles(directory).ToArray();
            //FolderLocation folderlocation = new FolderLocation() {
            //    Location = directory,
            //    Dated = DateTime.Now
            //};

            //Thread.Sleep(2000);
            // adding folder location entity object to the ORM model
            //db.FolderLocations.AddObject(folderlocation);
            // Save& committing Database Changes
            //db.SaveChanges();
            // running it parallel
            long count = files.Count();

            bool  doNotContinue    = false;
            float progressPercent2 = 0;

            if (count == 0)
            {
                count         = 1;
                doNotContinue = true;
            }
            if (directoryLoadPercentage == 0)
            {
                progressPercent2 = count / 100F;
            }
            else
            {
                progressPercent2 = directoryLoadPercentage / count;
            }

            //float percentIncrease2 = percentIncrease;
            //long FileID = FileNumberID;

            if (!doNotContinue)
            {
                //files.AsParallel().ForAll(file => {
                foreach (var file in files)
                {
                    bool          addFile  = false;
                    FileInfo      fileinfo = new FileInfo(file);
                    FileStructure filestr  = new FileStructure()
                    {
                        ID            = ++FileNumberID,
                        ExactLocation = fileinfo.FullName,
                        FileName      = fileinfo.Name,
                        Folder        = directory,

                        CreatedDate    = fileinfo.CreationTime,
                        ModifiedDate   = fileinfo.LastWriteTime,
                        LastAccessDate = fileinfo.LastAccessTime,
                        SizeBytes      = fileinfo.Length
                    };
                    if (filestr.FileName.IndexOf('.') > -1)
                    {
                        filestr.Extension = fileinfo.Extension.Remove(0, 1);
                    }

                    if (FileSizeType != -1)
                    {
                        if (filestr.SizeBytes >= fileSizeStart && filestr.SizeBytes <= fileSizeEnd)
                        {
                            addFile = true; //only if size meets the condition then add the file.
                        }
                    }
                    else
                    {
                        addFile = true; //no size limit
                    }

                    if (GenerateMD5)
                    {
                        filestr.MD5 = md5.GetMD5FromFile(file);
                    }

                    if (getConents)
                    {
                        filestr.Content             = ReadFile(file, filestr.SizeBytes);
                        FilesList.IsSavingNecessary = true;
                        if (filestr.IsContentEmpty)
                        {
                        }
                    }


                    if (filestr != null)
                    {
                        FilesList.Add(filestr);
                    }
                    if (addFile)
                    {
                        //if found by the size
                    }
                    percentIncrease += progressPercent2;

                    Flash.setProgress(percentIncrease);
                }
                ;  //files
                //progressbar.Value += 1;
                if (FilesList.FolderAlreadyRead == null)
                {
                    FilesList.FolderAlreadyRead = new List <string>();
                }
                //after reading the directory.
                if (!FilesList.FolderAlreadyRead.Exists(n => n == directory))
                {
                    //if not exist then add
                    FilesList.FolderAlreadyRead.Add(directory);
                }
            }

            //need to learn how to send type of type as list to remove the null
            if (directoryLoadPercentage == 0)
            {
                Flash.setProgress(0);
            }

            //FileNumberID = FileID;
            //percentIncrease = percentIncrease2;

            return(FilesList);
        }
        /// <summary>
        /// Read all files from a directory list
        /// </summary>
        /// <param name="FilesList"></param>
        /// <param name="directories"></param>
        /// <param name="GenerateMD5"></param>
        /// <param name="getConents"></param>
        /// <param name="Extensions"></param>
        /// <param name="fileSizeStart"></param>
        /// <param name="fileSizeEnd"></param>
        /// <param name="FileSizeType"></param>
        /// <param name="flash"></param>
        /// <returns></returns>
        public ListOfFiles <FileStructure> getFiles(
            ListOfFiles <FileStructure> FilesList,
            List <string> directories,
            DateTime startDate,
            DateTime endDate,
            int dateType             = -1,
            bool lookForDates        = false,
            bool GenerateMD5         = false,
            bool getConents          = false,
            string IncludeExtensions = "",
            string ExcludeExtensions = "",
            int fileSizeStart        = -1,
            int fileSizeEnd          = -1,
            int FileSizeType         = -1)
        {
            EncryptionGenerate md5 = new EncryptionGenerate();

            if (FileSizeType == FileSizeTypeStructure.KB)
            {
                fileSizeStart = fileSizeStart * (int)FileSizeTypeStructure.KB_1;
                fileSizeEnd   = fileSizeEnd * (int)FileSizeTypeStructure.KB_1;
            }
            else if (FileSizeType == FileSizeTypeStructure.MB)
            {
                fileSizeStart = fileSizeStart * (int)FileSizeTypeStructure.MB_1;
                fileSizeEnd   = fileSizeEnd * (int)FileSizeTypeStructure.MB_1;
            }
            else if (FileSizeType == FileSizeTypeStructure.GB)
            {
                fileSizeStart = fileSizeStart * (int)FileSizeTypeStructure.GB_1;
                fileSizeEnd   = fileSizeEnd * (int)FileSizeTypeStructure.GB_1;
            }
            else
            {
                fileSizeStart = -1;
                fileSizeEnd   = -1;
                FileSizeType  = -1;
            }
            if (directories.Count == 0)
            {
                return(FilesList);
            }
            int   CountDirectories = directories.Count;
            float progressPercent  = 100F / CountDirectories; // per folder percentage
            float percentIncrease  = 0;

            //List of extensions
            string[] IncludeExtList = null;
            string[] ExcludeExtList = null;
            if (!String.IsNullOrWhiteSpace(IncludeExtensions))
            {
                IncludeExtList = IncludeExtensions.Split(',');
            }

            if (!String.IsNullOrWhiteSpace(ExcludeExtensions))
            {
                ExcludeExtList = ExcludeExtensions.Split(',');
            }

            long FileNumberID = 0;

            //int threadCount = 0;
            //Thread[] threads; //new Thread[CountDirectories];
            directories.AsParallel().ForAll(directory => {
                //new Thread(() => {
                FilesList = getFile(FilesList,
                                    directory,
                                    ref FileNumberID,
                                    startDate,
                                    endDate,
                                    ref percentIncrease,
                                    dateType,
                                    lookForDates,
                                    progressPercent,
                                    GenerateMD5,
                                    getConents,
                                    IncludeExtList,
                                    ExcludeExtList,
                                    fileSizeStart,
                                    fileSizeEnd,
                                    FileSizeType
                                    );
                //}).Start();
            });//directory


            //need to learn how to send type of type as list to remove the null
            //foreach (var tr in threads) {
            //    tr.Join();
            //}
            Flash.setProgress(0);
            return(FilesList);
        }