public DirectoryInfoExtended(string di, SearchOptionExtended so = SearchOptionExtended.AllDirectories,
                              bool index = false, bool renameFolders = false, bool autoFile = false, bool checkForDuplicates = false, bool cleanupSmallFiles = true)
 {
     DirectoryInfo      = new DirectoryInfo(di);
     SearchOption       = so;
     Index              = index;
     RenameFolders      = renameFolders;
     AutoFile           = autoFile;
     CheckForDuplicates = checkForDuplicates;
     CleanupSmallFiles  = cleanupSmallFiles;
 }
        private static IEnumerable <FileInfo> GetFileList(string fileSearchPattern, string rootFolderPath, SearchOptionExtended so, bool includeHidden = false)
        {
            DateTime       writeTimeCutoff = DateTime.UtcNow.AddSeconds(-5);
            string         folderPath      = string.Empty;
            Queue <string> pending         = new Queue <string>();

            pending.Enqueue(rootFolderPath);
            string[] tmp;
            while (pending.Count > 0)
            {
                folderPath = pending.Dequeue();
                if ((folderPath == rootFolderPath && (so == SearchOptionExtended.AllDirectories || so == SearchOptionExtended.TopDirectoryOnly)) || folderPath != rootFolderPath)
                {
                    tmp = Directory.GetFiles(folderPath, fileSearchPattern);
                    for (int i = 0; i < tmp.Length; i++)
                    {
                        var fi = new FileInfo(tmp[i]);

                        if (includeHidden || (!includeHidden && !fi.Attributes.HasFlag(FileAttributes.Hidden)))
                        {
                            if (fi.LastWriteTimeUtc < writeTimeCutoff)
                            {
                                yield return(fi);
                            }
                        }
                    }
                }

                if (so == SearchOptionExtended.AllDirectories || so == SearchOptionExtended.SubDirectories)
                {
                    tmp = Directory.GetDirectories(folderPath);
                    for (int i = 0; i < tmp.Length; i++)
                    {
                        pending.Enqueue(tmp[i]);
                    }
                }
            }
        }