/// <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)); } }