public static void FetchAllFromFile(string fileName, string password, EBlubbZipHelperLoadType loadType, out Dictionary<int, Stream> streamList, out Dictionary<int, string> fileList, out Dictionary<int, BlubbZipEntry> entryList) { fileList = new Dictionary<int, string>(); streamList = new Dictionary<int, Stream>(); entryList = new Dictionary<int, BlubbZipEntry>(); if (File.Exists(fileName) == false) throw new Exception("File not Found!\n" + fileName); using (FileStream fs = File.OpenRead(fileName)) { BlubbZipFile blubb = new BlubbZipFile(fs); blubb.Password = password; for (int cz = 0; cz < blubb.Count; cz++) { if (blubb[cz].IsFile == false) continue; if ((loadType & EBlubbZipHelperLoadType.Streams) > 0) streamList.Add(cz, blubb.GetInputStream(cz)); if ((loadType & EBlubbZipHelperLoadType.FileList) > 0) fileList.Add(cz, blubb[cz].Name.ToString(CultureInfo.InvariantCulture).Replace("/", @"\")); if ((loadType & EBlubbZipHelperLoadType.Entrys) > 0) entryList.Add(cz, blubb[cz].Clone() as BlubbZipEntry); } blubb.Close(); } }
public static void FetchAllFromFile(string blubbzipFilePath, string blubbzipPassword, EFastBlubbZipLoadType loadType, out Dictionary<int, Stream> StreamList, out Dictionary<int, string> FileList, out Dictionary<int, BlubbZipEntry> EntryList) { FileList = new Dictionary<int, string>(); StreamList = new Dictionary<int, Stream>(); EntryList = new Dictionary<int, BlubbZipEntry>(); if (File.Exists(blubbzipFilePath) == false) throw new Exception("File not Found!\n" + blubbzipFilePath); using (FileStream fs = File.OpenRead(blubbzipFilePath)) { BlubbZipFile blubb = new BlubbZipFile(fs); blubb.Password = blubbzipPassword; for (int cz = 0; cz < blubb.Count; cz++) { if (blubb[cz].IsFile == false) continue; if ((loadType & EFastBlubbZipLoadType.Streams) > 0) StreamList.Add(cz, blubb.GetInputStream(cz)); if ((loadType & EFastBlubbZipLoadType.FileList) > 0) FileList.Add(cz, blubb[cz].Name.ToString().Replace("/", @"\")); if ((loadType & EFastBlubbZipLoadType.Entrys) > 0) EntryList.Add(cz, blubb[cz].Clone() as BlubbZipEntry); } blubb.Close(); } }
public static MemoryStream FetchFromFile(string blubbzipFilePath, string blubbzipPassword, int entryIndex) { using (FileStream fs = File.OpenRead(blubbzipFilePath)) { BlubbZipFile blubb = new BlubbZipFile(fs); blubb.Password = blubbzipPassword; Stream s = blubb.GetInputStream(entryIndex); MemoryStream Writer = new MemoryStream(); byte[] data = new byte[4096]; int size = s.Read(data, 0, data.Length); while (size > 0) { Writer.Write(data, 0, size); size = s.Read(data, 0, data.Length); } blubb.Close(); return Writer; } }
public static Stream GetFileStream(string fromZip, string password, int index) { using (FileStream fs = File.OpenRead(fromZip)) { BlubbZipFile blubb = new BlubbZipFile(fs); blubb.Password = password; Stream s = blubb.GetInputStream(index); Stream writer = new MemoryStream(); byte[] data = new byte[4096]; int size = s.Read(data, 0, data.Length); while (size > 0) { writer.Write(data, 0, size); size = s.Read(data, 0, data.Length); } blubb.Close(); return writer; } }
public static MemoryStream[] FetchListFromFile(string fromZip, string Password, int[] list) { using (FileStream fs = File.OpenRead(fromZip)) { BlubbZipFile blubb = new BlubbZipFile(fs); blubb.Password = Password; MemoryStream[] Streams = new MemoryStream[list.Length]; int counter = 0; foreach (int index in list) { Stream s = blubb.GetInputStream(index); MemoryStream Writer = new MemoryStream(); byte[] data = new byte[4096]; int size = s.Read(data, 0, data.Length); while (size > 0) { Writer.Write(data, 0, size); size = s.Read(data, 0, data.Length); } Streams[counter++] = Writer; } blubb.Close(); return Streams; } }
/// <summary> /// Create a new <see cref="BlubbFile"/> whose data will be stored on a stream. /// </summary> /// <param name="outStream">The stream providing data storage.</param> /// <returns>Returns the newly created <see cref="BlubbFile"/></returns> /// <exception cref="ArgumentNullException"><paramref name="outStream"> is null</paramref></exception> /// <exception cref="ArgumentException"><paramref name="outStream"> doesnt support writing.</paramref></exception> public static BlubbZipFile Create( Stream outStream ) { if( outStream == null ) { throw new ArgumentNullException( "outStream" ); } if( !outStream.CanWrite ) { throw new ArgumentException( "Stream is not writeable", "outStream" ); } if( !outStream.CanSeek ) { throw new ArgumentException( "Stream is not seekable", "outStream" ); } BlubbZipFile result = new BlubbZipFile(); result.baseStream_ = outStream; return result; }
// Creators /// <summary> /// Create a new <see cref="BlubbFile"/> whose data will be stored in a file. /// </summary> /// <param name="fileName">The name of the archive to create.</param> /// <returns>Returns the newly created <see cref="BlubbFile"/></returns> /// <exception cref="ArgumentNullException"><paramref name="fileName"></paramref> is null</exception> public static BlubbZipFile Create( string fileName ) { if( fileName == null ) { throw new ArgumentNullException( "fileName" ); } FileStream fs = File.Create( fileName ); BlubbZipFile result = new BlubbZipFile(); result.name_ = fileName; result.baseStream_ = fs; result.isStreamOwner = true; return result; }
/// <summary> /// Initializes a new instance of the <see cref="DiskArchiveStorage"/> class. /// </summary> /// <param name="file">The file.</param> public DiskArchiveStorage( BlubbZipFile file ) : this( file, FileUpdateMode.Safe ) { }
// Constructors /// <summary> /// Initializes a new instance of the <see cref="DiskArchiveStorage"/> class. /// </summary> /// <param name="file">The file.</param> /// <param name="updateMode">The update mode.</param> public DiskArchiveStorage( BlubbZipFile file, FileUpdateMode updateMode ) : base( updateMode ) { if( file.Name == null ) { throw new BlubbZipException( "Cant handle non file archives" ); } fileName_ = file.Name; }
// Constructors /// <summary> /// Initialise a new instance of the <see cref="PartialInputStream"/> class. /// </summary> /// <param name="blubbFile">The <see cref="BlubbFile"/> containing the underlying stream to use for IO.</param> /// <param name="start">The start of the partial data.</param> /// <param name="length">The length of the partial data.</param> public PartialInputStream( BlubbZipFile blubbFile, long start, long length ) { start_ = start; length_ = length; // Although this is the only time the blubbfile is used // keeping a reference here prevents premature closure of // this blubb file and thus the baseStream_. // Code like this will cause apparently random failures depending // on the size of the files and when garbage is collected. // // BlubbFile z = new BlubbFile (stream); // Stream reader = z.GetInputStream(0); // uses reader here.... blubbFile_ = blubbFile; baseStream_ = blubbFile_.baseStream_; readPos_ = start; end_ = start + length; }
void CopyEntry( BlubbZipFile workFile, BlubbUpdate update ) { workFile.WriteLocalEntryHeader( update ); if( update.Entry.CompressedSize > 0 ) { const int NameLengthOffset = 26; long entryDataOffset = update.Entry.Offset + NameLengthOffset; // TODO: This wont work for SFX files! baseStream_.Seek( entryDataOffset, SeekOrigin.Begin ); uint nameLength = ReadLEUshort(); uint extraLength = ReadLEUshort(); baseStream_.Seek( nameLength + extraLength, SeekOrigin.Current ); CopyBytes( update, workFile.baseStream_, baseStream_, update.Entry.CompressedSize, false ); } CopyDescriptorBytes( update, workFile.baseStream_, baseStream_ ); }
void CopyEntryDirect( BlubbZipFile workFile, BlubbUpdate update, ref long destinationPosition ) { bool skipOver = false; if( update.Entry.Offset == destinationPosition ) { skipOver = true; } if( !skipOver ) { baseStream_.Position = destinationPosition; workFile.WriteLocalEntryHeader( update ); destinationPosition = baseStream_.Position; } long sourcePosition = 0; const int NameLengthOffset = 26; // TODO: Add base for SFX friendly handling long entryDataOffset = update.Entry.Offset + NameLengthOffset; baseStream_.Seek( entryDataOffset, SeekOrigin.Begin ); // Clumsy way of handling retrieving the original name and extra data length for now. // TODO: Stop re-reading name and data length in CopyEntryDirect. uint nameLength = ReadLEUshort(); uint extraLength = ReadLEUshort(); sourcePosition = baseStream_.Position + nameLength + extraLength; if( skipOver ) { destinationPosition += ( sourcePosition - entryDataOffset ) + NameLengthOffset + // Header size update.Entry.CompressedSize + GetDescriptorSize( update ); } else { if( update.Entry.CompressedSize > 0 ) { CopyEntryDataDirect( update, baseStream_, false, ref destinationPosition, ref sourcePosition ); } CopyDescriptorBytesDirect( update, baseStream_, ref destinationPosition, sourcePosition ); } }
void ModifyEntry( BlubbZipFile workFile, BlubbUpdate update ) { workFile.WriteLocalEntryHeader( update ); long dataStart = workFile.baseStream_.Position; // TODO: This is slow if the changes don't effect the data!! if( update.Entry.IsFile && ( update.Filename != null ) ) { using( Stream output = workFile.GetOutputStream( update.OutEntry ) ) { using( Stream source = this.GetInputStream( update.Entry ) ) { CopyBytes( update, output, source, source.Length, true ); } } } long dataEnd = workFile.baseStream_.Position; update.Entry.CompressedSize = dataEnd - dataStart; }
void AddEntry( BlubbZipFile workFile, BlubbUpdate update ) { Stream source = null; if( update.Entry.IsFile ) { source = update.GetSource(); if( source == null ) { source = updateDataSource_.GetSource( update.Entry, update.Filename ); } } if( source != null ) { using( source ) { long sourceStreamLength = source.Length; if( update.OutEntry.Size < 0 ) { update.OutEntry.Size = sourceStreamLength; } else { // Check for errant entries. if( update.OutEntry.Size != sourceStreamLength ) { throw new BlubbZipException( "Entry size/stream size mismatch" ); } } workFile.WriteLocalEntryHeader( update ); long dataStart = workFile.baseStream_.Position; using( Stream output = workFile.GetOutputStream( update.OutEntry ) ) { CopyBytes( update, output, source, sourceStreamLength, true ); } long dataEnd = workFile.baseStream_.Position; update.OutEntry.CompressedSize = dataEnd - dataStart; if( ( update.OutEntry.Flags & (int)GeneralBitFlags.Descriptor ) == (int)GeneralBitFlags.Descriptor ) { BlubbZipHelperStream helper = new BlubbZipHelperStream( workFile.baseStream_ ); helper.WriteDataDescriptor( update.OutEntry ); } } } else { workFile.WriteLocalEntryHeader( update ); update.OutEntry.CompressedSize = 0; } }
// Constructors /// <summary> /// Initialise a new instance of <see cref="TestStatus"/> /// </summary> /// <param name="file">The <see cref="BlubbFile"/> this status applies to.</param> public TestStatus( BlubbZipFile file ) { file_ = file; }