public FileIndex(string idxFile, string mulFile, int length) { Index = new Entry3D[length]; MulPath = mulFile; if (!File.Exists(idxFile)) idxFile = null; if (!File.Exists(MulPath)) MulPath = null; if (idxFile != null && MulPath != null) { using (FileStream index = new FileStream(idxFile, FileMode.Open, FileAccess.Read, FileShare.Read)) { Stream = new FileStream(MulPath, FileMode.Open, FileAccess.Read, FileShare.Read); int count = (int)(index.Length / 12); IdxLength = index.Length; GCHandle gc = GCHandle.Alloc(Index, GCHandleType.Pinned); byte[] buffer = new byte[index.Length]; index.Read(buffer, 0, (int)index.Length); Marshal.Copy(buffer, 0, gc.AddrOfPinnedObject(), (int)Math.Min(IdxLength, length * 12)); gc.Free(); for (int i = count; i < length; ++i) { Index[i].lookup = -1; Index[i].length = -1; Index[i].extra = -1; } } } else { Stream = null; return; } }
private static void LoadUOPIndex() { UOPFormatHeader formatHeader; using (FileStream reader = File.Open( Path.Combine( m_DataPath, "artLegacyMUL.uop" ), FileMode.Open, FileAccess.Read, FileShare.ReadWrite )) { BinaryReader binaryReader = new BinaryReader( reader ); formatHeader = reader.ReadStruct<UOPFormatHeader>(); for (int i = 0; i < formatHeader.NumberOfFiles; i++) { string entryName = string.Format( "build/artlegacymul/{0:D8}.tga", i ); UInt64 hash = HashFileName( entryName ); if (!m_Hashes.ContainsKey( hash )) m_Hashes.Add( hash, i ); } Int64 nextAddress = formatHeader.FirstAddress; do { UOPBlockHeader blockHeader; reader.Seek( nextAddress, SeekOrigin.Begin ); blockHeader = reader.ReadStruct<UOPBlockHeader>(); nextAddress = blockHeader.NextAddress; for (int i = 0; i < blockHeader.NumberOfFiles; i++) { UOPFileHeader fileHeader; fileHeader = reader.ReadStruct<UOPFileHeader>(); if (fileHeader.DataHeaderAddress == 0) continue; if (m_Hashes.ContainsKey( fileHeader.Hash )) { int index = m_Hashes[fileHeader.Hash]; m_Index[index] = new Entry3D( (int) fileHeader.DataHeaderAddress + fileHeader.Length, fileHeader.IsCompressed == 1 ? fileHeader.CompressedSize : fileHeader.DecompressedSize, 0 ); } } } while (nextAddress > 0); } }