private static void WriteArchive(string archiveFilename, List <FileStream> filesToPackReaders, List <IndexEntry> indexEntries, List <string> names, WaveFormatEx waveFormat) { // ClmFile cannot contain more than 32 bit size internal file count. ClmHeader header = ClmHeader.MakeHeader(waveFormat, (uint)names.Count); using (FileStream fs = new FileStream(archiveFilename, FileMode.Create, FileAccess.Write, FileShare.None)) using (BinaryWriter clmFileWriter = new BinaryWriter(fs)) { header.Serialize(clmFileWriter); // Prepare and write Archive Index PrepareIndex(ClmHeader.SizeInBytes, names, indexEntries); for (int i = 0; i < indexEntries.Count; ++i) { indexEntries[i].Serialize(clmFileWriter); } // Copy files into the archive for (int i = 0; i < header.packedFilesCount; ++i) { using (BinaryReader reader = new BinaryReader(filesToPackReaders[i], System.Text.Encoding.ASCII, true)) { reader.BaseStream.Seek(0, SeekOrigin.Begin); clmFileWriter.Write(reader.ReadBytes((int)reader.BaseStream.Length)); } } } }
//static_assert(16 == sizeof(IndexEntry), "ClmFile::IndexEntry is an unexpected size"); // Reads in the header when the volume is first opened and does some // basic error checking on the header. // Throws an error is problems encountered while reading the header. private void ReadHeader() { clmHeader = new ClmHeader(clmFileReader); try { clmHeader.VerifyFileVersion(); clmHeader.VerifyUnknown(); } catch (System.Exception e) { throw new System.Exception("Invalid clm header read from file " + m_ArchiveFilename + ". " + e); } m_Count = (int)clmHeader.packedFilesCount; indexEntries = new List <IndexEntry>(m_Count); for (int i = 0; i < m_Count; ++i) { indexEntries.Add(new IndexEntry(clmFileReader)); } }