示例#1
0
 public TarEntry(TarHeader header)
 {
     if (header == null)
     {
         throw new ArgumentNullException(nameof(header));
     }
     this._header = (TarHeader)header.Clone();
 }
示例#2
0
 public void GetFileTarHeader(TarHeader head, string f)
 {
     if (head == null)
     {
         throw new ArgumentNullException(nameof(head));
     }
     if (f == null)
     {
         throw new ArgumentNullException(nameof(f));
     }
     _file = f;
     string str = f;
     if (str.IndexOf(Environment.CurrentDirectory, StringComparison.Ordinal) == 0)
     {
         str = str.Substring(Environment.CurrentDirectory.Length);
     }
     str = str.Replace(Path.DirectorySeparatorChar, '/');
     while (str.StartsWith("/"))
     {
         str = str.Substring(1);
     }
     head.LinkName = string.Empty;
     head.Name = str;
     if (Directory.Exists(f))
     {
         head.Mode = 0x3eb;
         head.TypeFlag = 0x35;
         if ((head.Name.Length == 0) || (head.Name[head.Name.Length - 1] != '/'))
         {
             head.Name = head.Name + "/";
         }
         head.Size = 0L;
     }
     else
     {
         head.Mode = 0x81c0;
         head.TypeFlag = 0x30;
         head.Size = new FileInfo(f.Replace('/', Path.DirectorySeparatorChar)).Length;
     }
     head.ModTime = System.IO.File.GetLastWriteTime(f.Replace('/', Path.DirectorySeparatorChar)).ToUniversalTime();
     head.DevMajor = 0;
     head.DevMinor = 0;
 }
示例#3
0
 public TarEntry GetNextEntry()
 {
     if (_hasHitEof)
     {
         return null;
     }
     if (_currentEntry != null)
     {
         SkipToNextEntry();
     }
     byte[] block = _tarBuffer.ReadBlock();
     if (block == null)
     {
         _hasHitEof = true;
     }
     else if (TarBuffer.IsEndOfArchiveBlock(block))
     {
         _hasHitEof = true;
     }
     if (_hasHitEof)
     {
         _currentEntry = null;
     }
     else
     {
         try
         {
             TarHeader header = new TarHeader();
             header.ParseBuffer(block);
             if (!header.IsChecksumValid)
             {
                 throw new TarException("Header checksum is invalid");
             }
             _entryOffset = 0L;
             _entrySize = header.Size;
             StringBuilder builder = null;
             if (header.TypeFlag == 0x4c)
             {
                 byte[] buffer = new byte[0x200];
                 long size = _entrySize;
                 builder = new StringBuilder();
                 while (size > 0L)
                 {
                     int length = Read(buffer, 0, (size > buffer.Length) ? buffer.Length : ((int)size));
                     if (length == -1)
                     {
                         throw new InvalidHeaderException("Failed to read long name entry");
                     }
                     builder.Append(TarHeader.ParseName(buffer, 0, length));
                     size -= length;
                 }
                 SkipToNextEntry();
                 block = _tarBuffer.ReadBlock();
             }
             else if (header.TypeFlag == 0x67)
             {
                 SkipToNextEntry();
                 block = _tarBuffer.ReadBlock();
             }
             else if (header.TypeFlag == 120)
             {
                 SkipToNextEntry();
                 block = _tarBuffer.ReadBlock();
             }
             else if (header.TypeFlag == 0x56)
             {
                 SkipToNextEntry();
                 block = _tarBuffer.ReadBlock();
             }
             else if (((header.TypeFlag != 0x30) && (header.TypeFlag != 0)) && (header.TypeFlag != 0x35))
             {
                 SkipToNextEntry();
                 block = _tarBuffer.ReadBlock();
             }
             if (_entryFactory == null)
             {
                 _currentEntry = new TarEntry(block);
                 if (builder != null)
                 {
                     _currentEntry.Name = builder.ToString();
                 }
             }
             else
             {
                 _currentEntry = _entryFactory.CreateEntry(block);
             }
             _entryOffset = 0L;
             _entrySize = _currentEntry.Size;
         }
         catch (InvalidHeaderException exception)
         {
             _entrySize = 0L;
             _entryOffset = 0L;
             _currentEntry = null;
             throw new InvalidHeaderException(string.Format("Bad header in record {0} block {1} {2}", _tarBuffer.CurrentRecord, _tarBuffer.CurrentBlock, exception.Message));
         }
     }
     return _currentEntry;
 }
示例#4
0
 public void PutNextEntry(TarEntry entry)
 {
     if (entry == null)
     {
         throw new ArgumentNullException(nameof(entry));
     }
     if (entry.TarHeader.Name.Length >= 100)
     {
         TarHeader header = new TarHeader
         {
             TypeFlag = 0x4c,  
             UserId = 0, GroupId = 0, 
             GroupName = "", 
             UserName = "", 
             LinkName = "", 
             Size = entry.TarHeader.Name.Length
         };
         header.Name += "././@LongLink";
         header.WriteHeader(_blockBuffer);
         _buffer.WriteBlock(_blockBuffer);
         int nameOffset = 0;
         while (nameOffset < entry.TarHeader.Name.Length)
         {
             Array.Clear(_blockBuffer, 0, _blockBuffer.Length);
             TarHeader.GetAsciiBytes(entry.TarHeader.Name, nameOffset, _blockBuffer, 0, 0x200);
             nameOffset += 0x200;
             _buffer.WriteBlock(_blockBuffer);
         }
     }
     entry.WriteEntryHeader(_blockBuffer);
     _buffer.WriteBlock(_blockBuffer);
     _currBytes = 0L;
     _currSize = entry.IsDirectory ? 0L : entry.Size;
 }
示例#5
0
 public TarEntry(byte[] headerBuffer)
 {
     _header = new TarHeader();
     _header.ParseBuffer(headerBuffer);
 }
示例#6
0
 public static void NameTarHeader(TarHeader header, string name)
 {
     if (header == null)
     {
         throw new ArgumentNullException(nameof(header));
     }
     if (name == null)
     {
         throw new ArgumentNullException(nameof(name));
     }
     bool flag = name.EndsWith("/");
     header.Name = name;
     header.Mode = flag ? 0x3eb : 0x81c0;
     header.UserId = 0;
     header.GroupId = 0;
     header.Size = 0L;
     header.ModTime = DateTime.UtcNow;
     header.TypeFlag = flag ? ((byte)0x35) : ((byte)0x30);
     header.LinkName = string.Empty;
     header.UserName = string.Empty;
     header.GroupName = string.Empty;
     header.DevMajor = 0;
     header.DevMinor = 0;
 }
示例#7
0
 private TarEntry()
 {
     _header = new TarHeader();
 }