예제 #1
0
        /// <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);
                }
            }
        }