/// <summary>
        /// Create new project
        /// </summary>
        /// <param name="fileName">Log file name</param>
        /// <param name="logStream">Log file stream</param>
        /// <param name="projectName">Project name</param>
        /// <param name="patternDef">Analyzing pattern</param>
        /// <param name="enc">Log file encoding</param>
        /// <returns>Created project</returns>
        public FlatProject CreateProject(string fileName, Stream logStream, string projectName, PatternDefinition patternDef, Encoding enc)
        {
            log.In(logStream, projectName, patternDef);

            if (patternDef == null)
            {
                patternDef = PatternDefinition.CreateDefault();
            }

            currentProject                   = new FlatProject();
            currentProject.ProjectName       = projectName;
            currentProject.PatternDefinition = patternDef;

            string tempDir = CreateTempDirectory();

            currentProject.WorkingDirectory = tempDir;

            string logFileName = CreateDatabaseFilePath(currentProject);

            using (IntermediateLogWriter imLogWriter = new IntermediateLogWriter(logFileName, patternDef))
            {
                imLogWriter.Write(fileName, logStream, enc);
            }

            reader = new IntermediateLogReader(logFileName, currentProject.PatternDefinition);

            log.Out(currentProject);
            return(currentProject);
        }
        /// <summary>
        /// Open project from archived project file
        /// </summary>
        /// <param name="projectFilePath">Archived project file path</param>
        /// <returns>Opened flat project</returns>
        public FlatProject OpenProject(string projectFilePath)
        {
            log.In(projectFilePath);

            string tempDirectory = CreateTempDirectory();

            Archiver.Decompress(projectFilePath, tempDirectory);

            currentProject = DeserializeProject(CreateProjectFilePath(tempDirectory));
            currentProject.WorkingDirectory = tempDirectory;

            string logFileName = CreateDatabaseFilePath(currentProject);

            reader = new IntermediateLogReader(logFileName, currentProject.PatternDefinition);

            log.Out(currentProject);
            return(currentProject);
        }
        /// <summary>
        /// Save project to archived project file
        /// </summary>
        /// <param name="projectFilePath">Project file path</param>
        public void SaveProject(string projectFilePath)
        {
            log.In(projectFilePath);

            if (File.Exists(projectFilePath))
            {
                File.Delete(projectFilePath);
            }

            reader.Close();

            SerializeProject(currentProject, CreateProjectFilePath(currentProject.WorkingDirectory));
            Archiver.CompressDirectory(currentProject.WorkingDirectory, projectFilePath);

            string logFileName = CreateDatabaseFilePath(currentProject);

            reader = new IntermediateLogReader(logFileName, currentProject.PatternDefinition);

            log.Out();
        }