public bool Start(FileRequestControllerConfiguration <TAccount> configuration, ServerStatistics <TAccount> statistics)
        {
            FilesEnabled                        = configuration.FilesEnabled;
            FilesBaseUri                        = configuration.FilesBaseUri;
            FilesLocation                       = configuration.FilesLocation;
            FaviconPath                         = configuration.FaviconPath;
            FilesNeedAuthorization              = configuration.FilesNeedAuthorization;
            FileSections                        = configuration.FileSections;
            FilesPreprocessingEnabled           = configuration.FilesPreprocessingEnabled;
            ExistingFilesPreprocessingFrequency = configuration.ExistingFilesPreprocessingFrequency;
            _filesAuthorizer                    = configuration.FilesAuthorizer;
            _statistics                         = statistics;

            if (!IoHelper.HasWriteAccessToDirectory(FilesLocation))
            {
                LogMessage(LogLevel.Warning, $"Cannot use file folder {FilesLocation} : no write access");
                return(false);
            }

            if (!InitializeFileSections())
            {
                LogMessage(LogLevel.Warning, "Failed to initialize file sections");
                return(false);
            }

            if (FilesPreprocessingEnabled && FilesEnabled)
            {
                FilePreprocessController.Start(configuration.FilesPreprocessorThreads,
                                               configuration.FilesCompressionEnabled);
                if (ExistingFilesPreprocessingFrequency > 0)
                {
                    PreprocessExistingFiles();
                    _preprocessTimer          = new Timer(1000 * ExistingFilesPreprocessingFrequency);
                    _preprocessTimer.Elapsed += (sender, args) => PreprocessExistingFiles();
                    _preprocessTimer.Start();
                }
            }

            _started = true;
            return(true);
        }