private ImageMergeBatch ReadBatchImageInfo(string batchNumber, DateTime processingDate, string jobFolder) { var batch = new ImageMergeBatch { BatchNumber = batchNumber }; var frontRegex = new Regex(string.Format(adapterConfiguration.ImageMergeFrontFileRegex), RegexOptions.Compiled | RegexOptions.IgnoreCase); //get all front filenames that match the regex, and also extract the trace number using the regex var frontFiles = Directory .GetFiles(jobFolder) .Select(filename => new { filename, match = frontRegex.Match(filename) }) .Where(x => x.match.Success) .Select(x => new { x.filename, traceNumber = x.match.Groups["trace"].Value }) .ToList(); if (!frontFiles.Any()) { throw new InvalidOperationException(string.Format("No image files found for this job")); } //read all images foreach (var frontFile in frontFiles) { Log.Verbose("Adding front file {@frontFile} to the merge result", frontFile); var rearImageFilename = string.Format(adapterConfiguration.ImageMergeRearFileFormat, processingDate, frontFile.traceNumber); //string traceNumber = ResolveTraceNumber(frontFile.traceNumber); string traceNumber = RequestHelper.ResolveDocumentReferenceNumber(frontFile.traceNumber); var voucher = new ImageMergeVoucher { TraceNumber = traceNumber, FrontImageFilename = frontFile.filename, RearImageFilename = frontFile.filename.Replace("FRONT", "REAR"), }; batch.Vouchers.Add(voucher); } return(batch); }
private async Task WriteMergedImageFilesAsync(string batchNumber, string targetDirectory, ImageMergeBatch batch) { var frontFileName = string.Format(@"{0}\{1}", targetDirectory, string.Format(adapterConfiguration.ImageMergeFrontFilename, batchNumber)); var rearFileName = string.Format(@"{0}\{1}", targetDirectory, string.Format(adapterConfiguration.ImageMergeRearFilename, batchNumber)); using (var mergedFrontFile = File.Create(frontFileName)) using (var mergedRearFile = File.Create(rearFileName)) { long frontOffset = 0; long rearOffset = 0; //read and copy all images async foreach (var voucher in batch.Vouchers) { var frontImageFileStream = File.OpenRead(voucher.FrontImageFilename); var rearImageFileStream = File.OpenRead(voucher.RearImageFilename); voucher.FrontLength = frontImageFileStream.Length; voucher.RearLength = rearImageFileStream.Length; voucher.FrontOffset = frontOffset; voucher.RearOffset = rearOffset; frontOffset += voucher.FrontLength; rearOffset += voucher.RearLength; var frontTask = frontImageFileStream.CopyToAsync(mergedFrontFile); var rearTask = rearImageFileStream.CopyToAsync(mergedRearFile); await Task.WhenAll(frontTask, rearTask); } } }