/// <summary> /// Constructs a new UploadMetadata from the given parameters. /// </summary> /// <param name="metadataFilePath">The file path to assign to this metadata file (for saving purposes).</param> /// <param name="uploadParameters">The parameters to use for constructing this metadata.</param> internal UploadMetadata(string metadataFilePath, UploadParameters uploadParameters) { this.MetadataFilePath = metadataFilePath; this.UploadId = Guid.NewGuid().ToString("N"); this.InputFilePath = uploadParameters.InputFilePath; this.TargetStreamPath = uploadParameters.TargetStreamPath; string streamDirectory; var streamName = SplitTargetStreamPathByName(out streamDirectory); if (string.IsNullOrEmpty(streamDirectory)) { // the scenario where the file is being uploaded at the root this.SegmentStreamDirectory = string.Format("/{0}.segments.{1}", streamName, Guid.NewGuid()); } else { // the scenario where the file is being uploaded in a sub folder this.SegmentStreamDirectory = string.Format("{0}/{1}.segments.{2}", streamDirectory, streamName, Guid.NewGuid()); } this.IsBinary = uploadParameters.IsBinary; var fileInfo = new FileInfo(uploadParameters.InputFilePath); this.FileLength = fileInfo.Length; // we are taking the smaller number of segments between segment lengths of 256 and the segment growth logic. // this protects us against agressive increase of thread count resulting in far more segments than // is reasonable for a given file size. We also ensure that each segment is at least 256mb in size. // This is the size that ensures we have the optimal storage creation in the store. var preliminarySegmentCount = (int)Math.Ceiling((double)fileInfo.Length / uploadParameters.MaxSegementLength); this.SegmentCount = Math.Min(preliminarySegmentCount, UploadSegmentMetadata.CalculateSegmentCount(fileInfo.Length)); this.SegmentLength = UploadSegmentMetadata.CalculateSegmentLength(fileInfo.Length, this.SegmentCount); this.Segments = new UploadSegmentMetadata[this.SegmentCount]; for (int i = 0; i < this.SegmentCount; i++) { this.Segments[i] = new UploadSegmentMetadata(i, this); } }
/// <summary> /// Constructs a new UploadMetadata from the given parameters. /// </summary> /// <param name="metadataFilePath">The file path to assign to this metadata file (for saving purposes).</param> /// <param name="uploadParameters">The parameters to use for constructing this metadata.</param> /// <param name="frontEnd">The front end. This is used only in the constructor for determining file length</param> internal UploadMetadata(string metadataFilePath, UploadParameters uploadParameters, IFrontEndAdapter frontEnd, long fileSize = -1) { this.MetadataFilePath = metadataFilePath; this.UploadId = Guid.NewGuid().ToString("N"); this.InputFilePath = uploadParameters.InputFilePath; this.TargetStreamPath = uploadParameters.TargetStreamPath; this.IsDownload = uploadParameters.IsDownload; this.SegmentStreamDirectory = GetSegmentStreamDirectory(); this.IsBinary = uploadParameters.IsBinary; this.FileLength = fileSize < 0 ? frontEnd.GetStreamLength(uploadParameters.InputFilePath, !IsDownload) : fileSize; this.EncodingCodePage = uploadParameters.FileEncoding.CodePage; // we are taking the smaller number of segments between segment lengths of 256 and the segment growth logic. // this protects us against agressive increase of thread count resulting in far more segments than // is reasonable for a given file size. We also ensure that each segment is at least 256mb in size. // This is the size that ensures we have the optimal storage creation in the store. var preliminarySegmentCount = (int)Math.Ceiling((double)this.FileLength / uploadParameters.MaxSegementLength); this.SegmentCount = Math.Min(preliminarySegmentCount, UploadSegmentMetadata.CalculateSegmentCount(this.FileLength)); this.SegmentLength = UploadSegmentMetadata.CalculateSegmentLength(this.FileLength, this.SegmentCount); this.Segments = new UploadSegmentMetadata[this.SegmentCount]; for (int i = 0; i < this.SegmentCount; i++) { this.Segments[i] = new UploadSegmentMetadata(i, this); } if (!uploadParameters.IsBinary && this.SegmentCount > 1 && !this.IsDownload) { this.AlignSegmentsToRecordBoundaries(); // ensure that nothing strange happened during alignment this.ValidateConsistency(); } // initialize the status to pending, since it is not yet done. this.Status = SegmentUploadStatus.Pending; }