Basic implementation of
Inheritance: IEntryFactory
示例#1
0
        public ZipFileBuilder(Stream outStream)
        {
            zipStream = new ZipOutputStream(outStream);
            zipStream.SetLevel(9); //best compression

            factory = new ZipEntryFactory(DateTime.Now);
        }
示例#2
0
        /// <summary>
        /// Support UTF8
        /// Create list files
        /// </summary>
        /// <param name="zip">Zip.</param>
        /// <param name="zipPath">Zip path.</param>
        /// <param name="srcDir">Source dir.</param>
        /// <param name="srcFiles">Source files.</param>
        /// <param name="deleteSrcFiles">If set to <c>true</c> delete source files.</param>
        /// <param name="removedFiles">remove files are added to the list file</param>
        public static void CreateZipAndList(this FastZip zip, string zipPath, string srcDir, IEnumerable <FileInfo> srcFiles, bool deleteSrcFiles, IEnumerable <string> removedFiles = null)
        {
            string zipName = PathUtil.GetFileNameWithoutExt(zipPath) + ".zip";
            // Compress
            List <string> paths = new List <string>();

            foreach (FileInfo f in srcFiles)
            {
                paths.Add(f.FullName);
            }

            // Generate MD5 digest for assets
            StringBuilder zipFilter   = new StringBuilder();
            StringBuilder fileListStr = new StringBuilder();

            fileListStr.Append(DownloadList.ZIP_HEADER).Append(zipName).Append("\n");

            // create zip filter and file list
            foreach (FileInfo f in srcFiles)
            {
                string fullPath     = f.FullName;
                string relativePath = PathUtil.GetRelativePath(fullPath, srcDir);
                zipFilter.Append(relativePath).Append("$;");
                fileListStr.Append(DownloadList.ZIP_ENTRY_HEADER);
                AddDigest(fileListStr, relativePath, fullPath);
            }
            // add remove list
            foreach (string r in removedFiles)
            {
                fileListStr.Append(DownloadList.DELETE_HEADER).Append(r).Append("\n");
            }
            zipFilter.Replace(@"\", @"\\");

            // Zipping
            TextReplacer replace = new TextReplacer();

            replace.AddReplaceToken(@"\(", @"\(");
            replace.AddReplaceToken(@"\)", @"\)");
            replace.AddReplaceToken(@"\+", @"\+");
            replace.AddReplaceToken(@"\.", @"\.");
            ZipEntryFactory ef = zip.EntryFactory as ZipEntryFactory;

            ef.IsUnicodeText = true;
            string filter = replace.Replace(zipFilter.ToString());

            UnityEngine.Debug.Log("srcdir:" + srcDir);
            UnityEngine.Debug.Log("filter:" + filter);
            zip.CreateZip(zipPath, srcDir, true, filter);
            if (deleteSrcFiles)
            {
                foreach (string deletePath in paths)
                {
                    File.Delete(PathUtil.Combine(PathUtil.Combine(srcDir, deletePath)));
                }
            }
            File.WriteAllText(PathUtil.ReplaceExtension(zipPath, ".bytes"), fileListStr.ToString());
        }
示例#3
0
 /// <summary>
 /// Initialise a new instance of <see cref="FastZip"/> using the specified <see cref="DateTime"/>
 /// </summary>
 /// <param name="time">The time to set all <see cref="ZipEntry.DateTime"/> values for created or extracted <see cref="ZipEntry">Zip Entries</see>.</param>
 public FastZip(DateTime time)
 {
     entryFactory_             = new ZipEntryFactory(time);
     restoreDateTimeOnExtract_ = true;
 }
示例#4
0
 /// <summary>
 /// Initialise a new instance of <see cref="FastZip"/> using the specified <see cref="TimeSetting"/>
 /// </summary>
 /// <param name="timeSetting">The <see cref="TimeSetting">time setting</see> to use when creating or extracting <see cref="ZipEntry">Zip entries</see>.</param>
 /// <remarks>Using <see cref="TimeSetting.LastAccessTime">TimeSetting.LastAccessTime</see><see cref="TimeSetting.LastAccessTimeUtc">[Utc]</see> when
 /// creating an archive will set the file time to the moment of reading.
 /// </remarks>
 public FastZip(TimeSetting timeSetting)
 {
     entryFactory_             = new ZipEntryFactory(timeSetting);
     restoreDateTimeOnExtract_ = true;
 }
示例#5
0
        public void UnicodeText()
        {
            FastZip zippy = new FastZip();
            ZipEntryFactory factory = new ZipEntryFactory();
            factory.IsUnicodeText = true;
            zippy.EntryFactory = factory;

            string tempFilePath = GetTempFilePath();
            Assert.IsNotNull(tempFilePath, "No permission to execute this test?");

            const string tempName1 = "a.dat";
            string addFile = Path.Combine(tempFilePath, tempName1);
            MakeTempFile(addFile, 1);

            try
            {
                MemoryStream target = new MemoryStream();
                zippy.CreateZip(target, tempFilePath, false, tempName1, null);

                MemoryStream archive = new MemoryStream(target.ToArray());

                using (ZipFile z = new ZipFile(archive))
                {
                    Assert.AreEqual(1, z.Count);
                    Assert.IsTrue(z[0].IsUnicodeText);
                }
            }
            finally
            {
                File.Delete(addFile);
            }
        }
示例#6
0
        public void Defaults()
        {
            DateTime testStart=DateTime.Now;
            ZipEntryFactory f=new ZipEntryFactory();
            Assert.IsNotNull(f.NameTransform);
            Assert.AreEqual(-1, f.GetAttributes);
            Assert.AreEqual(0, f.SetAttributes);
            Assert.AreEqual(ZipEntryFactory.TimeSetting.LastWriteTime, f.Setting);

            Assert.LessOrEqual(testStart, f.FixedDateTime);
            Assert.GreaterOrEqual(DateTime.Now, f.FixedDateTime);

            f=new ZipEntryFactory(ZipEntryFactory.TimeSetting.LastAccessTimeUtc);
            Assert.IsNotNull(f.NameTransform);
            Assert.AreEqual(-1, f.GetAttributes);
            Assert.AreEqual(0, f.SetAttributes);
            Assert.AreEqual(ZipEntryFactory.TimeSetting.LastAccessTimeUtc, f.Setting);
            Assert.LessOrEqual(testStart, f.FixedDateTime);
            Assert.GreaterOrEqual(DateTime.Now, f.FixedDateTime);

            DateTime fixedDate = new DateTime(1999, 1, 2);
            f=new ZipEntryFactory(fixedDate);
            Assert.IsNotNull(f.NameTransform);
            Assert.AreEqual(-1, f.GetAttributes);
            Assert.AreEqual(0, f.SetAttributes);
            Assert.AreEqual(ZipEntryFactory.TimeSetting.Fixed, f.Setting);
            Assert.AreEqual(fixedDate, f.FixedDateTime);
        }
示例#7
0
        public void CreateInMemoryValues()
        {
            string tempFile = "bingo:";

            // Note the seconds returned will be even!
            DateTime epochTime = new DateTime(1980, 1, 1);
            DateTime createTime = new DateTime(2100, 2, 27, 11, 07, 56);
            DateTime lastWriteTime = new DateTime(2050, 11, 3, 7, 23, 32);
            DateTime lastAccessTime = new DateTime(2050, 11, 3, 0, 42, 12);

            ZipEntryFactory factory = new ZipEntryFactory();
            ZipEntry entry;
            int combinedAttributes;

            DateTime startTime = DateTime.Now;

            factory.Setting = ZipEntryFactory.TimeSetting.CreateTime;
            factory.GetAttributes = ~((int)FileAttributes.ReadOnly);
            factory.SetAttributes = (int)FileAttributes.ReadOnly;
            combinedAttributes = (int)FileAttributes.ReadOnly;

            entry = factory.MakeFileEntry(tempFile, false );
            Assert.IsTrue(TestHelper.CompareDosDateTimes(startTime, entry.DateTime) <= 0, "Create time failure");
            Assert.AreEqual(entry.ExternalFileAttributes, combinedAttributes);
            Assert.AreEqual(-1, entry.Size);

            factory.FixedDateTime = startTime;
            factory.Setting = ZipEntryFactory.TimeSetting.Fixed;
            entry = factory.MakeFileEntry(tempFile, false);
            Assert.AreEqual(0, TestHelper.CompareDosDateTimes(startTime, entry.DateTime), "Access time failure");
            Assert.AreEqual(-1, entry.Size);

            factory.Setting = ZipEntryFactory.TimeSetting.LastWriteTime;
            entry = factory.MakeFileEntry(tempFile, false);
            Assert.IsTrue(TestHelper.CompareDosDateTimes(startTime, entry.DateTime) <= 0, "Write time failure");
            Assert.AreEqual(-1, entry.Size);
        }
示例#8
0
        public void CreatedValues()
        {
            string tempDir=GetTempFilePath();
            Assert.IsNotNull(tempDir, "No permission to execute this test?");

            tempDir=Path.Combine(tempDir, "SharpZipTest");

            if( tempDir!=null ) {

                Directory.CreateDirectory(tempDir);

                try {
                    // Note the seconds returned will be even!
                    DateTime createTime=new DateTime(2100, 2, 27, 11, 07, 56);
                    DateTime lastWriteTime=new DateTime(2050, 11, 3, 7, 23, 32);
                    DateTime lastAccessTime=new DateTime(2050, 11, 3, 0, 42, 12);

                    string tempFile=Path.Combine(tempDir, "SharpZipTest.Zip");
                    using( FileStream f=File.Create(tempFile, 1024) ) {
                        f.WriteByte(0);
                    }

                    File.SetCreationTime(tempFile, createTime);
                    File.SetLastWriteTime(tempFile, lastWriteTime);
                    File.SetLastAccessTime(tempFile, lastAccessTime);

                    FileAttributes attributes=FileAttributes.Hidden;

                    File.SetAttributes(tempFile, attributes);
                    ZipEntryFactory factory=null;
                    ZipEntry entry;
                    int combinedAttributes=0;

                    try {
                        factory=new ZipEntryFactory();

                        factory.Setting=ZipEntryFactory.TimeSetting.CreateTime;
                        factory.GetAttributes=~((int)FileAttributes.ReadOnly);
                        factory.SetAttributes=(int)FileAttributes.ReadOnly;
                        combinedAttributes=(int)(FileAttributes.ReadOnly|FileAttributes.Hidden);

                        entry=factory.MakeFileEntry(tempFile);
                        Assert.AreEqual(createTime, entry.DateTime, "Create time failure");
                        Assert.AreEqual(entry.ExternalFileAttributes, combinedAttributes);
                        Assert.AreEqual(1, entry.Size);

                        factory.Setting=ZipEntryFactory.TimeSetting.LastAccessTime;
                        entry=factory.MakeFileEntry(tempFile);
                        Assert.AreEqual(lastAccessTime, entry.DateTime, "Access time failure");
                        Assert.AreEqual(1, entry.Size);

                        factory.Setting=ZipEntryFactory.TimeSetting.LastWriteTime;
                        entry=factory.MakeFileEntry(tempFile);
                        Assert.AreEqual(lastWriteTime, entry.DateTime, "Write time failure");
                        Assert.AreEqual(1, entry.Size);
                    }
                    finally {
                        File.Delete(tempFile);
                    }

                    // Do the same for directories
                    // Note the seconds returned will be even!
                    createTime=new DateTime(2090, 2, 27, 11, 7, 56);
                    lastWriteTime=new DateTime(2107, 12, 31, 23, 59, 58);
                    lastAccessTime=new DateTime(1980, 1, 1, 1, 0, 0);

                    Directory.SetCreationTime(tempDir, createTime);
                    Directory.SetLastWriteTime(tempDir, lastWriteTime);
                    Directory.SetLastAccessTime(tempDir, lastAccessTime);

                    factory.Setting=ZipEntryFactory.TimeSetting.CreateTime;
                    entry=factory.MakeDirectoryEntry(tempDir);
                    Assert.AreEqual(createTime, entry.DateTime, "Directory create time failure");
                    Assert.IsTrue((entry.ExternalFileAttributes&(int)FileAttributes.Directory)==(int)FileAttributes.Directory);

                    factory.Setting=ZipEntryFactory.TimeSetting.LastAccessTime;
                    entry=factory.MakeDirectoryEntry(tempDir);
                    Assert.AreEqual(lastAccessTime, entry.DateTime, "Directory access time failure");

                    factory.Setting=ZipEntryFactory.TimeSetting.LastWriteTime;
                    entry=factory.MakeDirectoryEntry(tempDir);
                    Assert.AreEqual(lastWriteTime, entry.DateTime, "Directory write time failure");
                }
                finally {
                    Directory.Delete(tempDir, true);
                }
            }
        }
示例#9
0
文件: Zip.cs 项目: xsharper/xsharper
 public scanDirParams(ZipOutputStream zip, string sourceDirectory, ZipEntryFactory entryFactory, ProgressHandler progress, IStringFilter nf, IStringFilter df)
 {
     Zip = zip;
     EntryFactory = entryFactory;
     Progress = progress;
     NameFilter = nf;
     DirFilter = df;
     DirEntries = new Dictionary<string, ZipFSEntry>(StringComparer.InvariantCultureIgnoreCase);
     SourceDirectory = Utils.BackslashAdd(new DirectoryInfo(sourceDirectory).FullName);
     Buffer = new byte[16384];
 }
示例#10
0
文件: Zip.cs 项目: xsharper/xsharper
        private object createZip(Stream fileStream, string sourceDirectory, IStringFilter nf, IStringFilter df)
        {
            ZipEntryFactory entryFactory;
            switch (ZipTime)
            {
                default:
                case ZipTime.Now:
                    entryFactory = new ZipEntryFactory(DateTime.Now);
                    break;
                case ZipTime.UtcNow:
                    entryFactory = new ZipEntryFactory(DateTime.UtcNow);
                    break;
                case ZipTime.FileTime:
                    entryFactory = new ZipEntryFactory(ZipEntryFactory.TimeSetting.LastWriteTime);
                    break;
                case ZipTime.UtcFileTime:
                    entryFactory = new ZipEntryFactory(ZipEntryFactory.TimeSetting.LastWriteTimeUtc);
                    break;
            }
            entryFactory.NameTransform = new ZipNameTransform(sourceDirectory);
            entryFactory.IsUnicodeText = Unicode;

            ProgressHandler progress = delegate(object x, ProgressEventArgs y) { Context.OnProgress(1, y.Name); };
            using (ZipOutputStream zip = new ZipOutputStream(fileStream))
            {
                if (Comment!=null)
                    zip.SetComment(Context.TransformStr(Password, Transform));
                if (Password != null)
                    zip.Password = Context.TransformStr(Password, Transform);
                zip.SetLevel(Level);

                return scanDir(sourceDirectory, new scanDirParams(zip, sourceDirectory, entryFactory, progress, nf, df));
            }
        }