コード例 #1
0
        public ConverterFileStatus FinishFileProcessing(ConverterFileInfo processingFile, bool processedSuccessfully)
        {
            Contract.RequiresArgumentNotNull(processingFile, nameof(processingFile));

            Contract.RequiresArgument(this.files[ConverterFileStatus.Processing].ContainsKey(processingFile.SourcePath), "File is not a processing file.");

            this.files[ConverterFileStatus.Processing].Remove(processingFile.SourcePath);

            ConverterFileStatus GetNewStatus()
            {
                if (processedSuccessfully)
                {
                    return(ConverterFileStatus.ProcessedSuccessfully);
                }

                if (processingFile.ProcessingAttemps < this.MaxProcessingAttemps)
                {
                    return(ConverterFileStatus.None);
                }

                return(ConverterFileStatus.Failed);
            }

            ConverterFileStatus newStatus = GetNewStatus();

            this.files[newStatus].Add(processingFile.SourcePath, processingFile);

            return(newStatus);
        }
コード例 #2
0
        public void StartFreeFileProcessing(ConverterFileInfo freeFile)
        {
            Contract.RequiresArgumentNotNull(freeFile, nameof(freeFile));

            Contract.RequiresArgument(this.files[ConverterFileStatus.None].ContainsKey(freeFile.SourcePath));

            this.files[ConverterFileStatus.None].Remove(freeFile.SourcePath);

            this.files[ConverterFileStatus.Processing].Add(freeFile.SourcePath, freeFile);
        }
コード例 #3
0
        public Task ScanSourceDirectory()
        {
            string[] GetSourceFiles() => Directory.GetFiles(
                this.sourceDirectory,
                this.searchPattern,
                SearchOption.AllDirectories);

            string GetRelativePath(string sourceDirectory, string sourcePath)
            {
                bool IsSeparator(char c) => PathUtils.NativeDirectorySeparatorChars.Contains(c);

                return(new string(
                           sourcePath
                           .Skip(this.sourceDirectory.Length)
                           .SkipWhile(c => IsSeparator(c))
                           .ToArray()));
            }

            void AddSourceFile(string sourcePath, string sourcePathSystemIndependent)
            {
                string relativePath = GetRelativePath(this.sourceDirectory, sourcePath);
                string destPath     = Path.Combine(this.destDirectory, relativePath);
                string destPathSystemIndependent = PathUtils.GetSystemIndependentPath(destPath);

                var converterFileInfo = new ConverterFileInfo(sourcePathSystemIndependent, destPathSystemIndependent);

                this.files[ConverterFileStatus.None].Add(sourcePathSystemIndependent, converterFileInfo);
            }

            if (this.isScanningSourceDirectory)
            {
                return(Task.CompletedTask);
            }

            this.isScanningSourceDirectory = true;
            try
            {
                var nonProcessingFiles = this.files
                                         .Where(item => item.Key != ConverterFileStatus.Processing)
                                         .Select(item => item.Value)
                                         .ToArray();

                var sourceFiles = GetSourceFiles();

                sourceFiles.ForEach(
                    sourcePath =>
                {
                    var sourcePathSystemIndependent = PathUtils.GetSystemIndependentPath(sourcePath);

                    if (this.files.Any(item => item.Value.ContainsKey(sourcePathSystemIndependent)))
                    {
                        return;
                    }

                    AddSourceFile(sourcePath, sourcePathSystemIndependent);
                });
            }
            finally
            {
                this.isScanningSourceDirectory = false;
            }

            return(Task.CompletedTask);
        }