/// <summary>
        /// Loads a Database from a XML file
        /// </summary>
        /// <param name="fileName">XML file name</param>
        /// <param name="basePath">Base path</param>
        /// <param name="pathType">Path type</param>
        /// <returns>New Database</returns>
        public static Database FromFile(string fileName, string basePath, PathType pathType)
        {
            // ensure file exists first
            if (!File.Exists(fileName))
            {
                // otherwise, return a new empty Database
                return new Database(fileName);
            }

            // ready serializer
            XmlSerializerNamespaces serializerNameSpace = new XmlSerializerNamespaces();
            serializerNameSpace.Add(String.Empty, String.Empty);
            XmlSerializer serializer = new XmlSerializer(typeof(DatabaseFile));

            // load all elements from the XML
            DatabaseFile databaseFile = null;
            using (StreamReader reader = new StreamReader(fileName))
            {
                try
                {
                    databaseFile = (DatabaseFile)serializer.Deserialize(reader);
                }
                catch (XmlException)
                {
                    // let callers handle error
                }
                catch (InvalidOperationException)
                {
                    // let callers handle error
                }
            }

            if (databaseFile == null)
            {
                return null;
            }

            Database db = new Database()
            {
                XmlFileName = fileName
            };

            // initialize all elements into the hash table
            foreach (FileChecksum fileChecksum in databaseFile.Files)
            {
                if (String.IsNullOrEmpty(fileChecksum.ResolvedFileName) ||
                    String.IsNullOrEmpty(fileChecksum.Checksum))
                {
                    // skip bad entries
                    continue;
                }

                // FilePath
                fileChecksum.InitFromXml(basePath, pathType);

                // add to the database's lookup table
                db._fileLookup.Add(fileChecksum.ResolvedFileName, fileChecksum);
            }

            return db;
        }
        /// <summary>
        /// Initializes a new instance of the <see cref="Engine" /> class
        /// </summary>
        /// <param name="xmlDatabasePath">XML database path</param>
        /// <param name="reporter">Reporter to use</param>
        /// <param name="basePath">Base path</param>
        /// <param name="excludePattern">Exclude pattern</param>
        /// <param name="matchPattern">Match pattern</param>
        /// <param name="matchType">Match type</param>
        /// <param name="pathType">Path type</param>
        /// <param name="checksumType">Checksum type</param>
        public Engine(
            string xmlDatabasePath,
            IEngineReporter reporter,
            string basePath,
            string excludePattern = "",
            string matchPattern = "*",
            MatchType matchType = MatchType.Wildcard,
            PathType pathType = PathType.RelativePath,
            ChecksumType checksumType = ChecksumType.MD5)
        {
            _xmlDatabasePath = xmlDatabasePath;
            _reporter = reporter;
            _basePath = basePath;
            _excludePattern = excludePattern;
            _matchPattern = matchPattern;
            _matchType = matchType;
            _pathType = pathType;
            _checksumType = checksumType;

            _db = Database.FromFile(_xmlDatabasePath, _basePath, _pathType);
        }