/// <summary>

        /// Search a directory or archive and add any files or sub-directories

        /// to the list of candidates currently being resolved

        /// </summary>

        /// <param name="candidates">Candidates currently being resolved</param>
        public void Explode(SubmissionCandidates candidates, string workingDirectory)
        {
            if (IsArchive)
            {
                // Archives in Archives!!
                if (IsArchivedFile)
                {
                    string exportPath = Path.Combine(workingDirectory, HunterConfig.GalileoDefaultDataFolder + Path.DirectorySeparatorChar + "galileo_" + Guid.ToString() + FileExtension);

                    ArchiveInfo.Extract(ReadPath, exportPath);
                    _resolvePath = exportPath;
                }

                if (_fileType == FileTypes.Types.Zip)
                {
                    _archiveInfo     = new ZipArchiveInfo(ReadPath);
                    _archiveChildren = new List <SubmissionCandidate>(10);

                    if (_archiveInfo.IsOpen == false)
                    {
                        // Probably best to do something better than this?
                        throw new Exception("Could not open archive???");
                    }

                    foreach (var fileName in _archiveInfo)
                    {
                        SubmissionCandidate candidate = candidates.Add(fileName, _depth + 1, this);
                        _archiveChildren.Add(candidate);
                    }

                    // We leave _archiveInfo open, because later the files
                    // will want to be inspected and possibly extracted.
                }
            }
            else if (IsDirectory)
            {
                System.IO.DirectoryInfo info = new System.IO.DirectoryInfo(ReadPath);
                foreach (var file in info.EnumerateFiles())
                {
                    candidates.Add(file.FullName, _depth + 1, this);
                }
                foreach (var directory in info.EnumerateDirectories())
                {
                    candidates.Add(directory.FullName, _depth + 1, this);
                }
            }
        }
        /// <summary>

        /// Export the file for processing, that if it is in an archive. Additionally

        /// final checks on the file so they are ready to become a submission

        /// </summary>
        protected void ExportFile(string workingDirectory, bool ignoreParent = false, bool onlySubmissions = false)
        {
            if (IsExported)
            {
                return;
            }

            _resolution |= SubmissionCandidateResolution.Exported;

            if (ignoreParent == false && Parent != null)
            {
                Parent.ExportFile(workingDirectory, ignoreParent, onlySubmissions);
            }

            if (IsArchive && _archiveChildren != null)
            {
                // Design path here. Using parents if any.

                string basePath = string.Empty;

                if (HasParent)
                {
                    // archive in a folder
                    if (Parent.IsDirectory)
                    {
                        basePath = Path.Combine(workingDirectory, HunterConfig.GalileoDefaultDataFolder);
                    }
                    // archive in a archive
                    else
                    {
                        basePath = Parent.ReadPath;
                    }
                }
                else
                {
                    basePath = Path.Combine(workingDirectory, HunterConfig.GalileoDefaultDataFolder);
                }


                //string basePath = Path.Combine(workingDirectory, HunterConfig.GalileoDefaultDataFolder);
                _resolvePath = Path.Combine(basePath, string.Format("A_{0}_{1}", GuidShorthand, FileName));

                // Create folder here.
                Directory.CreateDirectory(ReadPath);

                if (onlySubmissions == false)
                {
                    foreach (var child in _archiveChildren)
                    {
                        if (child.IsIgnoredButExport)
                        {
                            child.ExportFile(ReadPath, true, onlySubmissions);
                        }
                    }
                }
            }

            if ((IsSubmission || IsIgnoredButExport) && !IsFiltered)
            {
                // @TODO
                //    If in an archive, then export file to readpath.
                if (IsArchivedFile)
                {
                    _fileName = System.IO.Path.GetFileName(ReadPath);
                    _fileNameWithoutExtension = System.IO.Path.GetFileNameWithoutExtension(ReadPath);
                    _fileExtension            = System.IO.Path.GetExtension(ReadPath);

                    string[] paths = Platform.SplitArchivePath(ReadPath);
                    paths = Platform.CleanArchivePaths(paths);

                    string exportPath = Path.Combine(workingDirectory, Path.Combine(paths));
                    Directory.CreateDirectory(Path.GetDirectoryName(new DirectoryInfo(exportPath).FullName));

                    ArchiveInfo.Extract(ReadPath, exportPath);

                    _fileInfo    = new System.IO.FileInfo(exportPath);
                    _resolvePath = exportPath;
                }
                else
                {
                    _fileInfo = new System.IO.FileInfo(ReadPath);

                    // Update with new information based on finalized pathing information
                    _fileName = System.IO.Path.GetFileName(ReadPath);
                    _fileNameWithoutExtension = System.IO.Path.GetFileNameWithoutExtension(ReadPath);
                    _fileExtension            = System.IO.Path.GetExtension(ReadPath);
                }
                _containerPath = Parent.ContainerPath;
            }
        }