Example #1
0
        /// <summary>
        /// Get writer for the archive entry
        /// </summary>
        /// <param name="entry"></param>
        /// <returns></returns>
        public static IArchiveEntryWriter GetWriter(InternalWriteArchiveEntry entry, IReadableCPIOArchiveEntry readableEntry)
        {
            switch (entry.ArchiveType)
            {
            case ArchiveEntryType.DIRECTORY:
                return(new DirectoryEntryWriter(entry, readableEntry));

            case ArchiveEntryType.FILE:
                if (entry.nLink > 1)
                {
                    return(new HardLinkEntryWriter(entry, readableEntry));
                }
                else
                {
                    return(new FileEntryWriter(entry, readableEntry));
                }

            case ArchiveEntryType.SYMBOLIC_LINK:
                return(new SymbolicLinkEntryWriter(entry, readableEntry));

            default:
                throw new Exception("Нет класса, реализующего запись для данного типа");
            }
        }
 public DirectoryEntryWriter(InternalWriteArchiveEntry internalEntry, IReadableCPIOArchiveEntry readableArchiveEntry)
     : base(internalEntry, readableArchiveEntry)
 {
 }
 public SymbolicLinkEntryWriter(InternalWriteArchiveEntry internalEntry, IReadableCPIOArchiveEntry readableArchiveEntry)
     : base(internalEntry, readableArchiveEntry)
 {
 }
 public AbstractArchiveEntryWriter(InternalWriteArchiveEntry internalEntry, IReadableCPIOArchiveEntry readableArchiveEntry)
 {
     _internalEntry        = internalEntry;
     _readableArchiveEntry = readableArchiveEntry;
 }
        /// <summary>
        /// Extract archive to disk
        /// </summary>
        /// <param name="destFolder"></param>
        /// <param name="flags"></param>
        /// <returns></returns>
        public bool Extract(string destFolder, CpioExtractFlags[] flags = null)
        {
            if (!Directory.Exists(destFolder))
            {
                if (Directory.CreateDirectory(destFolder) == null)
                {
                    throw new Exception(string.Format("The destinition directory {0} can not be created", destFolder));
                }
            }

            bool findTrailer = false;

            _fileStream.Seek(0, SeekOrigin.Begin);

            // list all the archive entry
            List <IReadableCPIOArchiveEntry> archiveEntries = new List <IReadableCPIOArchiveEntry>();

            IReadableCPIOArchiveEntry archiveEntry = CreateReadableArchiveEntry(flags);
            int sizeBuffer = archiveEntry.EntrySize;

            byte[] buffer = new byte[sizeBuffer];

            while (_fileStream.Read(buffer, 0, sizeBuffer) == sizeBuffer)
            {
                archiveEntry = CreateReadableArchiveEntry(flags);
                archiveEntry.FillEntry(buffer);

                ulong fileNameSize = archiveEntry.FileNameSize;
                if (fileNameSize != 0)
                {
                    byte[] fileName = new byte[fileNameSize];
                    _fileStream.Read(fileName, 0, (int)fileNameSize);
                    archiveEntry.FileName = fileName;
                }
                if (archiveEntry.IsLastArchiveEntry())
                {
                    findTrailer = true;
                    break;
                }

                archiveEntry.ReadMetadataEntry();
                if (archiveEntry.HasData)
                {
                    ulong  dataSize = archiveEntry.DataSize;
                    byte[] data     = new byte[dataSize];
                    _fileStream.Read(data, 0, (int)dataSize);
                    archiveEntry.Data = data;
                }

                // save entry to disk
                if (archiveEntry.Writer.ExtractEntryToDisk(destFolder) == null)
                {
                    Console.WriteLine("Fail to extract the archive entry: {0}", archiveEntry.ToString());
                    Directory.Delete(destFolder, true);
                    return(false);
                }
                archiveEntries.Add(archiveEntry);
            }
            if (!findTrailer)
            {
                Console.WriteLine("Not find the end entry in file. File is invalid format");
                Directory.Delete(destFolder, true);
                return(false);
            }
            else
            {
                return(PostProcessingEntries(destFolder, archiveEntries));
            }
        }