Exemplo n.º 1
0
 public void Tar_Japanese_Name(int length)
 {
     using (var mstm = new MemoryStream())
     {
         var enc = new ArchiveEncoding()
         {
             Default = Encoding.UTF8
         };
         var twopt = new TarWriterOptions(CompressionType.None, true);
         twopt.ArchiveEncoding = enc;
         var fname = new string((char)0x3042, length);
         using (var tw = new TarWriter(mstm, twopt))
             using (var input = new MemoryStream(new byte[32]))
             {
                 tw.Write(fname, input, null);
             }
         using (var inputMemory = new MemoryStream(mstm.ToArray()))
         {
             var tropt = new ReaderOptions()
             {
                 ArchiveEncoding = enc
             };
             using (var tr = TarReader.Open(inputMemory, tropt))
             {
                 while (tr.MoveToNextEntry())
                 {
                     Assert.Equal(fname, tr.Entry.Key);
                 }
             }
         }
     }
 }
        private void SaveCompressedFile(string sourceFilePath, string compressedFilePath)
        {
            using var sourceFileStream           = _fileStream.CreateFileStream(sourceFilePath, FileMode.Open, FileAccess.Read, FileShare.ReadWrite);
            using var targetCompressedFileStream = _file.OpenWrite(compressedFilePath);

            var tarWriterOptions = new TarWriterOptions(CompressionType.LZip, true);

            using var targetWriter = _tarWriter.CreateTarWriter(targetCompressedFileStream, tarWriterOptions);

            targetWriter.Write(Path.GetFileName(sourceFilePath), sourceFileStream);
        }
Exemplo n.º 3
0
        /// <summary>
        /// Compress (TAR/BZip2) an unencrypted FAES File.
        /// </summary>
        /// <param name="unencryptedFile">Unencrypted FAES File</param>
        /// <returns>Path of the unencrypted, TAR/BZip2 compressed file</returns>
        public string CompressFAESFile(FAES_File unencryptedFile)
        {
            FileAES_IntUtilities.CreateEncryptionFilePath(unencryptedFile, "TAR", out string tempRawPath, out _, out string tempOutputPath);

            TarWriterOptions wo = new TarWriterOptions(CompressionType.BZip2, true);

            using (Stream stream = File.OpenWrite(tempOutputPath))
                using (var writer = new TarWriter(stream, wo))
                {
                    writer.WriteAll(tempRawPath, "*", SearchOption.AllDirectories);
                }
            return(tempOutputPath);
        }
Exemplo n.º 4
0
        public void Tar_Read_One_At_A_Time()
        {
            var archiveEncoding = new ArchiveEncoding {
                Default = Encoding.UTF8,
            };
            var tarWriterOptions = new TarWriterOptions(CompressionType.None, true)
            {
                ArchiveEncoding = archiveEncoding,
            };
            var testBytes = Encoding.UTF8.GetBytes("This is a test.");

            using (var memoryStream = new MemoryStream())
            {
                using (var tarWriter = new TarWriter(memoryStream, tarWriterOptions))
                    using (var testFileStream = new MemoryStream(testBytes))
                    {
                        tarWriter.Write("test1.txt", testFileStream);
                        testFileStream.Position = 0;
                        tarWriter.Write("test2.txt", testFileStream);
                    }

                memoryStream.Position = 0;

                var numberOfEntries = 0;

                using (var archiveFactory = TarArchive.Open(memoryStream))
                {
                    foreach (var entry in archiveFactory.Entries)
                    {
                        ++numberOfEntries;

                        using (var tarEntryStream = entry.OpenEntryStream())
                            using (var testFileStream = new MemoryStream())
                            {
                                tarEntryStream.CopyTo(testFileStream);
                                Assert.Equal(testBytes.Length, testFileStream.Length);
                            }
                    }
                }

                Assert.Equal(2, numberOfEntries);
            }
        }
Exemplo n.º 5
0
        public void Tar_Create_New()
        {
            string scratchPath = Path.Combine(SCRATCH_FILES_PATH, "Tar.tar");
            string unmodified  = Path.Combine(TEST_ARCHIVES_PATH, "Tar.noEmptyDirs.tar");

            // var aropt = new Ar

            using (var archive = TarArchive.Create())
            {
                archive.AddAllFromDirectory(ORIGINAL_FILES_PATH);
                var twopt = new TarWriterOptions(CompressionType.None, true);
                twopt.ArchiveEncoding = new ArchiveEncoding()
                {
                    Default = Encoding.GetEncoding(866)
                };
                archive.SaveTo(scratchPath, twopt);
            }
            CompareArchivesByPath(unmodified, scratchPath);
        }
Exemplo n.º 6
0
        /// <summary>
        /// Constructs a new lzip instance.
        /// </summary>
        /// <param name="stream">The stream to read or write depending on access mode</param>
        /// <param name="mode">The archive access mode</param>
        /// <param name="options">The options passed on the commandline</param>
        public FileArchiveLzip(Stream stream, ArchiveMode mode, IDictionary <string, string> options)
        {
            m_stream = stream;
            m_mode   = mode;
            if (mode == ArchiveMode.Write)
            {
                var compression = new TarWriterOptions(CompressionType.LZip, true);
                //var compression = new TarWriterOptions(CompressionType.None, true);

                // TODO: can the compression level be set?

                string cplevel;
                int    tmplevel;
                if (options.TryGetValue(COMPRESSION_LEVEL_OPTION, out cplevel) && int.TryParse(cplevel, out tmplevel))
                {
                    // TODO: set compression level to tmplevel
                }

                m_writer = WriterFactory.Open(m_stream, ArchiveType.Tar, compression);

                // TODO: set m_flushBufferSize for the size of endheader?
            }
        }
 public TarWriter CreateTarWriter(Stream destination, TarWriterOptions options)
 {
     return(new TarWriter(destination, options));
 }
Exemplo n.º 8
0
        ///// <summary>
        /////  OnDir = (int sumCount,int curCount,string fileName)=>{ };
        ///// </summary>
        //public Action<int, int, string> OnDir;



        /// <summary>
        /// Supported Reader Formats: Zip, GZip, Tar
        /// </summary>
        public void PackByWriter()
        {
            fileCount      = 0;
            sumEntityCount = 0;

            ArchiveType   archiveType;
            WriterOptions writerOptions;

            switch (Path.GetExtension(outputPath)?.ToLower())
            {
            case ".gz":
                archiveType   = ArchiveType.GZip;
                writerOptions = new GZipWriterOptions();
                break;

            case ".tar":
                archiveType   = ArchiveType.Tar;
                writerOptions = new TarWriterOptions(CompressionType.None, true);
                break;

            case ".zip":
                archiveType   = ArchiveType.Zip;
                writerOptions = new WriterOptions(CompressionType.Deflate);      //CompressionType.BZip2  CompressionType.None CompressionType.LZMA CompressionType.PPMd
                break;

            default: throw new InvalidOperationException("Cannot Support file format.  Supported Formats: .zip, .gz, .tar ");
            }


            //writerOptions.ArchiveEncoding.Default = System.Text.Encoding.UTF8;
            //readOptions.ArchiveEncoding.Default = System.Text.Encoding.Default;
            writerOptions.ArchiveEncoding.Default = System.Text.Encoding.GetEncoding("GB2312");



            if (File.Exists(inputPath))
            {
                //压缩单个文件
                sumEntityCount = 1;

                #region (x.x.2)压缩
                Directory.CreateDirectory(Path.GetDirectoryName(outputPath));
                using (var fileStream = File.OpenWrite(outputPath))
                    using (var writer = WriterFactory.Open(fileStream, archiveType, writerOptions))
                    {
                        var directoryLength = inputPath.Length;

                        var relativePath = Path.GetFileName(inputPath);
                        writer.Write(relativePath, inputPath);

                        OnFile?.Invoke(1, 1, relativePath);
                        OnProgress?.Invoke(1.0f, 1, 1);
                    }
                #endregion
            }
            else
            {
                //压缩文件夹

                #region (x.x.1)获取文件(夹)总个数
                var enumerable = Directory.EnumerateFiles(inputPath, "*", SearchOption.AllDirectories);
                sumEntityCount = enumerable.Count();
                #endregion

                #region (x.x.2)压缩
                Directory.CreateDirectory(Path.GetDirectoryName(outputPath));
                using (var fileStream = File.OpenWrite(outputPath))
                    using (var writer = WriterFactory.Open(fileStream, archiveType, writerOptions))
                    {
                        int importedEntityCount = 0;
                        int step     = Math.Min((int)(sumEntityCount * progressStep), stepMaxEntityCount);
                        int nextStep = step;


                        var directoryLength = inputPath.Length;
                        foreach (var file in enumerable)
                        {
                            var relativePath = file.Substring(directoryLength);
                            writer.Write(relativePath, file);

                            importedEntityCount++;


                            //if (entry.IsDirectory)
                            //{
                            //    dirCount++;
                            //    OnDir?.Invoke(sumEntityCount, importedEntityCount, relativePath);
                            //}
                            //else
                            {
                                fileCount++;
                                OnFile?.Invoke(sumEntityCount, importedEntityCount, relativePath);
                            }

                            if (importedEntityCount >= nextStep)
                            {
                                nextStep = Math.Min(sumEntityCount, nextStep + step);
                                OnProgress?.Invoke(1.0f * importedEntityCount / sumEntityCount, sumEntityCount, importedEntityCount);
                            }
                        }
                    }

                #endregion
            }
        }