public async Task ExecuteAsync(
            IRootFolder root,
            IFileWriter writer,
            bool channelsAsCsv,
            bool deleteProcessedFiles,
            int parallelism)
        {
            var studyScalarFiles   = new StudyScalarFiles();
            var channelDataColumns = new ChannelDataColumns();

            var allFiles = await root.GetFilesAsync();

            var filesToWrite = new List <IFile>();

            foreach (var file in allFiles)
            {
                try
                {
                    TryAddFileToStudyScalarResults.Execute(file, studyScalarFiles);

                    if (channelsAsCsv && TryGetChannelMetadata.Execute(file, out var channelMetadata))
                    {
                        channelDataColumns.Add(new CsvColumn(channelMetadata, file));
                    }
                    else
                    {
                        filesToWrite.Add(file);
                    }
                }
                catch (Exception t)
                {
                    Console.WriteLine();
                    Console.WriteLine("Failed to process file: " + file);
                    Console.WriteLine(t);

                    if (t is AbortProcessingException)
                    {
                        throw;
                    }
                }
            }

            await filesToWrite.ForEachAsync(parallelism, async file =>
            {
                await writer.WriteExistingFile(root, file);
            });

            await WriteChannelDataAsCsv.ExecuteAsync(root, writer, deleteProcessedFiles, parallelism, channelDataColumns);

            await WriteCombinedStudyScalarData.ExecuteAsync(root, writer, studyScalarFiles);
        }
        public static bool Execute(IFile file, StudyScalarFiles studyScalarFiles)
        {
            switch (file.FileName)
            {
            case Constants.StudyScalarResultsFileName:
                studyScalarFiles.ScalarResults = file;
                return(true);

            case Constants.StudyScalarMetadataFileName:
                studyScalarFiles.ScalarMetadata = file;
                return(true);

            case Constants.StudyScalarInputsFileName:
                studyScalarFiles.ScalarInputs = file;
                return(true);

            case Constants.StudyScalarInputsMetadataFileName:
                studyScalarFiles.ScalarInputsMetadata = file;
                return(true);
            }

            return(false);
        }