示例#1
0
        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));
                        }
                    }
                }
        }
示例#2
0
        //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));
            }
        }