示例#1
0
        public bool Write(InternalWriteArchiveEntry _entry, string destFolder)
        {
            string fileName = InternalWriteArchiveEntry.GetFileName(_entry.FileName);
            string fullPathToFile = Path.Combine(destFolder, fileName);
            string root = Path.GetDirectoryName(fullPathToFile);
            if (Directory.CreateDirectory(root) != null)
            {
                using (FileStream fs = new FileStream(fullPathToFile, FileMode.Create))
                {
                    if (_entry.Data != null)
                    {
                        var data = _entry.Data.Where(g => g != '\0').ToArray();
                        fs.Write(data, 0, data.Length);
                    }
                }

                if ((_entry.ExtractFlags & (uint)ExtractFlags.ARCHIVE_EXTRACT_TIME) > 0)
                {
                    File.SetLastWriteTimeUtc(fullPathToFile, _entry.mTime);
                }

                return true;
            }
            return false;
        }
示例#2
0
        public override void ReadMetadataEntry()
        {
            _archiveEntry.Dev   = _entry.c_dev.ToString();
            _archiveEntry.INode = _entry.c_ino.ToString();

            // Type, Permission
            long mode = _entry.c_mode;

            _archiveEntry.ArchiveType = InternalWriteArchiveEntry.GetArchiveEntryType(mode);
            _archiveEntry.Permission  = InternalWriteArchiveEntry.GetPermission(mode);

            _archiveEntry.Uid = _entry.c_uid;
            _archiveEntry.Gid = _entry.c_gid;

            unsafe
            {
                fixed(ushort *pointer = _entry.c_mtime)
                {
                    byte[] array = GetByteArrayFromFixedArray(pointer, 2);
                    _archiveEntry.mTime = ((long)BitConverter.ToInt32(array, 0)).ToUnixTime();
                }
            }
            _archiveEntry.nLink = _entry.c_nlink;
            // rDev
            _archiveEntry.rDev         = _entry.c_rdev;
            _archiveEntry.ExtractFlags = _extractFlags;
        }
        public override bool Write(string destFolder)
        {
            string fileName       = InternalWriteArchiveEntry.GetFileName(_internalEntry.FileName);
            string fullPathToFile = Path.Combine(destFolder, fileName);
            string root           = Path.GetDirectoryName(fullPathToFile);

            if (Directory.CreateDirectory(root) != null)
            {
                using (FileStream fs = new FileStream(fullPathToFile, FileMode.Create))
                {
                    if (_internalEntry.Data != null)
                    {
                        var data = _internalEntry.Data.Where(g => g != '\0').ToArray();
                        fs.Write(data, 0, data.Length);
                    }
                }

                if ((_internalEntry.ExtractFlags & (uint)CpioExtractFlags.ARCHIVE_EXTRACT_TIME) > 0)
                {
                    File.SetLastWriteTimeUtc(fullPathToFile, _internalEntry.mTime);
                }

                return(true);
            }
            return(false);
        }
        string IArchiveEntryWriter.PostExtractEntryToDisk(string destFolder, List <IReadableCPIOArchiveEntry> entries)
        {
            if (_internalEntry.nLink > 0 && !_internalEntry.IsExtractToDisk)
            {
                if (IsPostExtractEntry())
                {
                    switch (_internalEntry.ArchiveType)
                    {
                    case ArchiveEntryType.FILE:
                    {
                        var hardLinkFiles = entries.Where(a => a.INode == _readableArchiveEntry.INode);
                        ExtractHardlinkFiles(destFolder, hardLinkFiles.ToList());
                    }
                    break;

                    case ArchiveEntryType.SYMBOLIC_LINK:
                    {
                        _readableArchiveEntry.Writer.WriteEntryToDisk(destFolder);
                    }
                    break;

                    default:
                        throw new Exception("Not expected type of entry");
                    }
                }
                else
                {
                    throw new Exception("The entry must be saved to disk already!");
                }
            }
            return(InternalWriteArchiveEntry.GetFileName(_internalEntry.FileName));
        }
        public override bool Write(string destFolder)
        {
            string fileName       = InternalWriteArchiveEntry.GetFileName(_internalEntry.FileName);
            string fullPathToFile = Path.Combine(destFolder, fileName);
            string root           = Path.GetDirectoryName(fullPathToFile);

            if (Directory.CreateDirectory(root) != null)
            {
                string targetFile           = InternalWriteArchiveEntry.GetTargetFileToLink(_internalEntry.Data);
                string fullPathToTargetFile = Path.Combine(destFolder, targetFile);
                if (WindowsNativeLibrary.CreateSymbolicLink(fullPathToFile, fullPathToTargetFile, SYMBOLIC_LINK_FLAG.File))
                {
                    if ((_internalEntry.ExtractFlags & (uint)CpioExtractFlags.ARCHIVE_EXTRACT_TIME) > 0)
                    {
                        SetSymLinkLastWriteTime(fullPathToFile, _internalEntry.mTime);
                    }
                    return(true);
                }
                else
                {
                    throw new Exception(string.Format("Symbolic link for file {0} no created. Win32Error: {1}", fullPathToFile, Marshal.GetLastWin32Error()));
                }
            }
            return(false);
        }
 public bool Write(InternalWriteArchiveEntry entry, string destFolder)
 {
     string fileName = InternalWriteArchiveEntry.GetFileName(entry.FileName);
     string fullPathToFile = Path.Combine(destFolder, fileName);
     string root = Path.GetDirectoryName(fullPathToFile);
     if (Directory.CreateDirectory(root) != null)
     {
         string targetFile = InternalWriteArchiveEntry.GetTargetFileToLink(entry.Data);
         string fullPathToTargetFile = Path.Combine(destFolder, targetFile);
         if (WindowsNativeLibrary.CreateSymbolicLink(fullPathToFile, fullPathToTargetFile, 0))
         {
             if ((entry.ExtractFlags & (uint)ExtractFlags.ARCHIVE_EXTRACT_TIME) > 0)
             {
                 SetSymLinkLastWriteTime(fullPathToFile, entry.mTime);
             }
             return true;
         }
         else
         {
             Console.WriteLine("Symbolic link for file {0} no created. Win32Error: {1}", fullPathToFile, Marshal.GetLastWin32Error());
             return false;
         }
     }
     return false;
 }
        /// <summary>
        /// extract hardlink files
        /// </summary>
        /// <param name="destFolder"></param>
        /// <param name="archiveEntries"></param>
        /// <returns></returns>
        private void ExtractHardlinkFiles(string destFolder, List <IReadableCPIOArchiveEntry> archiveEntries)
        {
            var originalEntry = archiveEntries.FirstOrDefault(a => a.DataSize > 0);

            if (originalEntry == null)
            {
                throw new Exception("Not found file with data for creating hardlink file");
            }
            originalEntry.Writer.WriteEntryToDisk(destFolder);

            archiveEntries.Remove(originalEntry);
            foreach (var entry in archiveEntries)
            {
                (entry.Writer as HardLinkEntryWriter).OriginalFilePath = InternalWriteArchiveEntry.GetFileName(originalEntry.FileName);
                entry.Writer.WriteEntryToDisk(destFolder);
            }
        }
 string IArchiveEntryWriter.ExtractEntryToDisk(string destFolder)
 {
     if (_internalEntry.nLink > 0 && !_internalEntry.IsExtractToDisk)
     {
         if (IsPostExtractEntry())
         {
             return(InternalWriteArchiveEntry.GetFileName(_internalEntry.FileName));
         }
         else
         {
             return(_readableArchiveEntry.Writer.WriteEntryToDisk(destFolder));
         }
     }
     else
     {
         return(null);
     }
 }
示例#9
0
        public override bool Write(string destFolder)
        {
            string fileName       = InternalWriteArchiveEntry.GetFileName(_internalEntry.FileName);
            string fullPathToFile = Path.Combine(destFolder, fileName);
            string root           = Path.GetDirectoryName(fullPathToFile);

            if (Directory.CreateDirectory(root) != null)
            {
                if (OriginalFilePath == null)
                {
                    // write as simple file
                    using (FileStream fs = new FileStream(fullPathToFile, FileMode.Create))
                    {
                        if (_internalEntry.Data != null)
                        {
                            var data = _internalEntry.Data.Where(g => g != '\0').ToArray();
                            fs.Write(data, 0, data.Length);
                        }
                    }
                    return(true);
                }
                else
                {
                    string fullPathToTargetFile = Path.Combine(destFolder, OriginalFilePath);
                    if (WindowsNativeLibrary.CreateHardLink(fullPathToFile, fullPathToTargetFile, IntPtr.Zero))
                    {
                        if ((_internalEntry.ExtractFlags & (uint)CpioExtractFlags.ARCHIVE_EXTRACT_TIME) > 0)
                        {
                            File.SetLastWriteTimeUtc(fullPathToFile, _internalEntry.mTime);
                        }
                        return(true);
                    }
                    else
                    {
                        throw new Exception(string.Format("Hardlink for file {0} no created. Win32Error: {1}", fullPathToFile, Marshal.GetLastWin32Error()));
                    }
                }
            }
            return(false);
        }
        public override bool Write(string destFolder)
        {
            string dir           = InternalWriteArchiveEntry.GetFileName(_internalEntry.FileName);
            var    d             = Directory.GetParent(dir);
            string fullPathToDir = Path.Combine(destFolder, dir);

            if (Directory.CreateDirectory(fullPathToDir) != null)
            {
                if ((_internalEntry.ExtractFlags & (uint)CpioExtractFlags.ARCHIVE_EXTRACT_TIME) > 0)
                {
                    string currentDir = fullPathToDir;
                    string _dir       = dir;
                    do
                    {
                        Directory.SetLastWriteTimeUtc(currentDir, _internalEntry.mTime);
                        _dir       = Path.GetDirectoryName(_dir);
                        currentDir = Path.GetDirectoryName(currentDir);
                    }while (!string.IsNullOrEmpty(_dir) && _dir != ".");
                }
                return(true);
            }
            return(false);
        }
 public bool Write(InternalWriteArchiveEntry _entry, string destFolder)
 {
     string dir = InternalWriteArchiveEntry.GetFileName(_entry.FileName);
     var d = Directory.GetParent(dir);
     string fullPathToDir = Path.Combine(destFolder, dir);
     if (Directory.CreateDirectory(fullPathToDir) != null)
     {
         if ((_entry.ExtractFlags & (uint)ExtractFlags.ARCHIVE_EXTRACT_TIME) > 0)
         {
             string currentDir = fullPathToDir;
             string _dir = dir;
             do
             {
                 Directory.SetLastWriteTimeUtc(currentDir, _entry.mTime);
                 _dir = Path.GetDirectoryName(_dir);
                 currentDir = Path.GetDirectoryName(currentDir);
             }
             while (!string.IsNullOrEmpty(_dir) && _dir != ".");
         }
         return true;
     }
     return false;
 }
示例#12
0
        public override void ReadMetadataEntry()
        {
            unsafe
            {
                byte[] majorBuffer;
                // Dev
                fixed(byte *pointer = _entry.c_dev)
                {
                    majorBuffer = GetByteArrayFromFixedArray(pointer, 6);
                }

                _archiveEntry.Dev = GetValueFromOctalValue(majorBuffer).ToString();

                // Ino
                fixed(byte *pointer = _entry.c_ino)
                {
                    majorBuffer = GetByteArrayFromFixedArray(pointer, 6);
                }

                _archiveEntry.INode = GetValueFromOctalValue(majorBuffer).ToString();

                // Type, Permission
                fixed(byte *pointer = _entry.c_mode)
                {
                    majorBuffer = GetByteArrayFromFixedArray(pointer, 6);
                }

                long mode = (long)GetValueFromOctalValue(majorBuffer);
                _archiveEntry.ArchiveType = InternalWriteArchiveEntry.GetArchiveEntryType(mode);
                _archiveEntry.Permission  = InternalWriteArchiveEntry.GetPermission(mode);

                // Uid
                fixed(byte *pointer = _entry.c_uid)
                {
                    majorBuffer = GetByteArrayFromFixedArray(pointer, 6);
                }

                _archiveEntry.Uid = (int)GetValueFromOctalValue(majorBuffer);

                // Gid
                fixed(byte *pointer = _entry.c_gid)
                {
                    majorBuffer = GetByteArrayFromFixedArray(pointer, 6);
                }

                _archiveEntry.Gid = (int)GetValueFromOctalValue(majorBuffer);

                // mTime
                fixed(byte *pointer = _entry.c_mtime)
                {
                    majorBuffer = GetByteArrayFromFixedArray(pointer, 11);
                }

                _archiveEntry.mTime = ((long)(GetValueFromOctalValue(majorBuffer))).ToUnixTime();

                // nLink
                fixed(byte *pointer = _entry.c_nlink)
                {
                    majorBuffer = GetByteArrayFromFixedArray(pointer, 6);
                }

                _archiveEntry.nLink = (long)GetValueFromOctalValue(majorBuffer);

                // rDev
                fixed(byte *pointer = _entry.c_rdev)
                {
                    majorBuffer = GetByteArrayFromFixedArray(pointer, 6);
                }

                _archiveEntry.rDev         = (int)GetValueFromOctalValue(majorBuffer);
                _archiveEntry.ExtractFlags = _extractFlags;
            }
        }
 public DirectoryEntryWriter(InternalWriteArchiveEntry internalEntry, IReadableCPIOArchiveEntry readableArchiveEntry)
     : base(internalEntry, readableArchiveEntry)
 {
 }
 public SymbolicLinkEntryWriter(InternalWriteArchiveEntry internalEntry, IReadableCPIOArchiveEntry readableArchiveEntry)
     : base(internalEntry, readableArchiveEntry)
 {
 }
 public bool IsPostExtractEntry(InternalWriteArchiveEntry _entry)
 {
     return true;
 }
 string IArchiveEntryWriter.WriteEntryToDisk(string destFolder)
 {
     _internalEntry.IsExtractToDisk = Write(destFolder);
     return(_internalEntry.IsExtractToDisk ? InternalWriteArchiveEntry.GetFileName(_internalEntry.FileName) : null);
 }
 public AbstractArchiveEntryWriter(InternalWriteArchiveEntry internalEntry, IReadableCPIOArchiveEntry readableArchiveEntry)
 {
     _internalEntry        = internalEntry;
     _readableArchiveEntry = readableArchiveEntry;
 }