123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559 |
- using System;
- using System.IO;
- namespace CommonMPQ.SharpZipLib.Tar
- {
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
- public class TarEntry : ICloneable
- {
- #region Constructors
-
-
-
- private TarEntry()
- {
- header = new TarHeader();
- }
-
-
-
-
-
-
-
-
- public TarEntry(byte[] headerBuffer)
- {
- header = new TarHeader();
- header.ParseBuffer(headerBuffer);
- }
-
-
-
-
-
- public TarEntry(TarHeader header)
- {
- if ( header == null )
- {
- throw new ArgumentNullException("header");
- }
- this.header = (TarHeader)header.Clone();
- }
- #endregion
- #region ICloneable Members
-
-
-
-
- public object Clone()
- {
- TarEntry entry = new TarEntry();
- entry.file = file;
- entry.header = (TarHeader)header.Clone();
- entry.Name = Name;
- return entry;
- }
- #endregion
-
-
-
-
-
-
- public static TarEntry CreateTarEntry(string name)
- {
- TarEntry entry = new TarEntry();
- TarEntry.NameTarHeader(entry.header, name);
- return entry;
- }
-
-
-
-
-
-
-
- public static TarEntry CreateEntryFromFile(string fileName)
- {
- TarEntry entry = new TarEntry();
- entry.GetFileTarHeader(entry.header, fileName);
- return entry;
- }
-
-
-
-
-
-
-
-
-
- public override bool Equals(object obj)
- {
- TarEntry localEntry = obj as TarEntry;
- if ( localEntry != null )
- {
- return Name.Equals(localEntry.Name);
- }
- return false;
- }
-
-
-
-
-
- public override int GetHashCode()
- {
- return Name.GetHashCode();
- }
-
-
-
-
-
-
-
-
-
-
-
-
- public bool IsDescendent(TarEntry toTest)
- {
- if ( toTest == null ) {
- throw new ArgumentNullException("toTest");
- }
- return toTest.Name.StartsWith(Name);
- }
-
-
-
-
-
-
-
- public TarHeader TarHeader
- {
- get {
- return header;
- }
- }
-
-
-
-
- public string Name
- {
- get {
- return header.Name;
- }
- set {
- header.Name = value;
- }
- }
-
-
-
-
- public int UserId
- {
- get {
- return header.UserId;
- }
- set {
- header.UserId = value;
- }
- }
-
-
-
-
- public int GroupId
- {
- get {
- return header.GroupId;
- }
- set {
- header.GroupId = value;
- }
- }
-
-
-
-
- public string UserName
- {
- get {
- return header.UserName;
- }
- set {
- header.UserName = value;
- }
- }
-
-
-
-
- public string GroupName
- {
- get {
- return header.GroupName;
- }
- set {
- header.GroupName = value;
- }
- }
-
-
-
-
-
-
-
-
-
-
- public void SetIds(int userId, int groupId)
- {
- UserId = userId;
- GroupId = groupId;
- }
-
-
-
-
-
-
-
-
-
-
- public void SetNames(string userName, string groupName)
- {
- UserName = userName;
- GroupName = groupName;
- }
-
-
-
- public DateTime ModTime {
- get {
- return header.ModTime;
- }
- set {
- header.ModTime = value;
- }
- }
-
-
-
-
-
-
-
- public string File {
- get {
- return file;
- }
- }
-
-
-
-
- public long Size {
- get {
- return header.Size;
- }
- set {
- header.Size = value;
- }
- }
-
-
-
-
-
-
-
- public bool IsDirectory {
- get {
- if (file != null) {
- return Directory.Exists(file);
- }
-
- if (header != null) {
- if ((header.TypeFlag == TarHeader.LF_DIR) || Name.EndsWith( "/" )) {
- return true;
- }
- }
- return false;
- }
- }
-
-
-
-
-
-
-
-
-
-
- public void GetFileTarHeader(TarHeader header, string file)
- {
- if ( header == null ) {
- throw new ArgumentNullException("header");
- }
- if ( file == null ) {
- throw new ArgumentNullException("file");
- }
- this.file = file;
-
- string name = file;
- #if !NETCF_1_0 && !NETCF_2_0
-
- if (name.IndexOf(Environment.CurrentDirectory) == 0) {
- name = name.Substring(Environment.CurrentDirectory.Length);
- }
- #endif
-
- name = name.Replace(Path.DirectorySeparatorChar, '/');
-
-
-
- while (name.StartsWith("/")) {
- name = name.Substring(1);
- }
- header.LinkName = String.Empty;
- header.Name = name;
-
- if (Directory.Exists(file)) {
- header.Mode = 1003;
- header.TypeFlag = TarHeader.LF_DIR;
- if ( (header.Name.Length == 0) || header.Name[header.Name.Length - 1] != '/') {
- header.Name = header.Name + "/";
- }
-
- header.Size = 0;
- } else {
- header.Mode = 33216;
- header.TypeFlag = TarHeader.LF_NORMAL;
- header.Size = new FileInfo(file.Replace('/', Path.DirectorySeparatorChar)).Length;
- }
- header.ModTime = System.IO.File.GetLastWriteTime(file.Replace('/', Path.DirectorySeparatorChar)).ToUniversalTime();
- header.DevMajor = 0;
- header.DevMinor = 0;
- }
-
-
-
-
-
-
-
-
- public TarEntry[] GetDirectoryEntries()
- {
- if ( (file == null) || !Directory.Exists(file)) {
- return new TarEntry[0];
- }
-
- string[] list = Directory.GetFileSystemEntries(file);
- TarEntry[] result = new TarEntry[list.Length];
- for (int i = 0; i < list.Length; ++i) {
- result[i] = TarEntry.CreateEntryFromFile(list[i]);
- }
-
- return result;
- }
-
-
-
-
-
-
-
- public void WriteEntryHeader(byte[] outBuffer)
- {
- header.WriteHeader(outBuffer);
- }
-
-
-
-
-
-
-
-
-
-
-
- static public void AdjustEntryName(byte[] buffer, string newName)
- {
- TarHeader.GetNameBytes(newName, buffer, 0, TarHeader.NAMELEN);
- }
-
-
-
-
-
-
-
-
-
-
- static public void NameTarHeader(TarHeader header, string name)
- {
- if ( header == null ) {
- throw new ArgumentNullException("header");
- }
- if ( name == null ) {
- throw new ArgumentNullException("name");
- }
- bool isDir = name.EndsWith("/");
-
- header.Name = name;
- header.Mode = isDir ? 1003 : 33216;
- header.UserId = 0;
- header.GroupId = 0;
- header.Size = 0;
-
- header.ModTime = DateTime.UtcNow;
-
- header.TypeFlag = isDir ? TarHeader.LF_DIR : TarHeader.LF_NORMAL;
-
- header.LinkName = String.Empty;
- header.UserName = String.Empty;
- header.GroupName = String.Empty;
-
- header.DevMajor = 0;
- header.DevMinor = 0;
- }
- #region Instance Fields
-
-
-
- string file;
-
-
-
-
- TarHeader header;
- #endregion
- }
- }
|