/// <summary> /// TODO: description /// </summary> /// <param name="inputFile"></param> /// <param name="outputDirectory"></param> /// <param name="settings"></param> public Content(Path inputFile, Path outputDirectory, PackageSettings settings = null) { if (!File.Exists(inputFile)) { throw new FileNotFoundException("Unable to create content.", inputFile); } PackageSettings pkgSettings = settings ?? new PackageSettings(); Compressed = pkgSettings.CompressionEnabled; Path contentDirectory = Path.Combine(outputDirectory, Id + "\\"); Directory.CreateDirectory(contentDirectory); try { if (pkgSettings.CompressionEnabled) { string origPath = inputFile; inputFile = Utility.GetTempFilePath(); Utility.Compress(origPath, inputFile); } // break the file up into parts of specified chunk size using (FileStream fs = File.OpenRead(inputFile)) { long bytesCopied = 0; int fileIndex = 0; do { string fileName = $"{fileIndex}{pkgSettings.PartExtension}"; string path = Path.Combine(contentDirectory, fileName); long bytesToCopy = Math.Min(fs.Length - bytesCopied, pkgSettings.PartSize); using (var file = File.OpenWrite(path)) { fs.CopyToCount(file, bytesToCopy); } Parts.Add(new FileInformation(fileName, Utility.ComputeHash(path))); bytesCopied += bytesToCopy; fileIndex++; } while (bytesCopied < fs.Length); } } finally { if (pkgSettings.CompressionEnabled) { File.Delete(inputFile); } } }