예제 #1
0
        public ZipFile(Stream strm, bool read)
        {
            _strm = strm;
            if (!read)
                _bw = new BinaryWriter(new GZipStream(_strm, CompressionMode.Compress, true));
            else
            {
                _br = new BinaryReader(new GZipStream(_strm, CompressionMode.Decompress, true));
                _base = new sZippedFolder("");
                while (true)
                {
                    byte[] bhead = new byte[512];
                    int bread = _br.Read(bhead, 0, 512);
                    if (bread == 0)
                        break;
                    TarHeader head = new TarHeader(bhead);
                    switch (head.TypeFlag)
                    {
                        case TarHeader.EntryTypes.DIRECTORY:
                            _base.AddFolder(head.Name, head.Prefix);
                            break;
                        case TarHeader.EntryTypes.NORMAL:
                            byte[] data = _br.ReadBytes((int)head.Size);
                            int size = 0;
                            while ((data.Length + size) % 512 != 0)
                            {
                                _br.ReadByte();
                                size++;
                            }
                            _base.AddFile(head, data);
                            break;

                    }
                }
            }
        }
 private void RestoreFiles(sZippedFolder fold, string basePath)
 {
     foreach (sZippedFolder fld in fold.Folders)
     {
         DirectoryInfo di = new DirectoryInfo(basePath + Path.DirectorySeparatorChar + fld.Name);
         if (!di.Exists)
             di.Create();
         RestoreFiles(fld, di.FullName);
     }
     foreach (ZipFile.sZippedFile file in fold.Files)
     {
         FileStream fs = new FileStream(basePath + Path.DirectorySeparatorChar + file.Name, FileMode.Create, FileAccess.Write, FileShare.None);
         BinaryWriter bw = new BinaryWriter(fs);
         bw.Write(file.Data);
         bw.Flush();
         bw.Close();
     }
 }
예제 #3
0
 internal void AddFolder(string name, string prefix)
 {
     if ((prefix == _name) || (prefix == ""))
         _folders.Add(new sZippedFolder(name));
     else
     {
         string[] split = prefix.Split('/');
         prefix = prefix.Substring(prefix.IndexOf(split[0]));
         prefix = prefix.TrimStart('/');
         bool add = true;
         for (int x = 0; x < _folders.Count; x++)
         {
             if (_folders[x].Name == split[0])
             {
                 add = false;
                 _folders[x].AddFolder(name, prefix);
                 x = _folders.Count;
             }
         }
         if (add)
         {
             sZippedFolder fold = new sZippedFolder(split[0]);
             fold.AddFolder(name, prefix);
             _folders.Add(fold);
         }
     }
 }