public MegFileHolder Load(string filePath) { if (null == filePath || !StringUtility.HasText(filePath)) { throw new ArgumentNullException(nameof(filePath)); } if (!m_fileSystem.File.Exists(filePath)) { throw new FileNotFoundException($"The file {filePath} does not exist."); } uint headerSize = GetMegFileHeaderSize(filePath); byte[] megFileHeader = new byte[headerSize]; using (BinaryReader reader = new BinaryReader(m_fileSystem.FileStream.Create(filePath, FileMode.Open))) { reader.Read(megFileHeader, 0, megFileHeader.Length); } MegFileBuilder builder = new MegFileBuilder(); MegFile megFile = builder.FromBytes(megFileHeader); MegFileHolder holder = new MegFileHolder(m_fileSystem.Path.GetDirectoryName(filePath), m_fileSystem.Path.GetFileNameWithoutExtension(filePath)); for (int i = 0; i < megFile.Header.NumFiles; i++) { string fileName = megFile.FileNameTable[i].FileName; uint fileOffset = megFile.FileContentTable[i].FileStartOffsetInBytes; uint fileSize = megFile.FileContentTable[i].FileSizeInBytes; holder.Content.Add(new MegFileDataEntry(fileName, Convert.ToInt32(fileOffset), fileSize)); } return(holder); }
public void PackFilesAsMegArchive(string megArchiveName, IDictionary <string, string> packedFileNameToAbsoluteFilePathsMap, string targetDirectory) { if (!StringUtility.HasText(megArchiveName)) { throw new ArgumentException( "The provided argument is null, an empty string or only consists of whitespace.", nameof(megArchiveName)); } if (!packedFileNameToAbsoluteFilePathsMap.Any()) { throw new ArgumentException( "The provided argument does not contain any elements.", nameof(packedFileNameToAbsoluteFilePathsMap)); } if (!StringUtility.HasText(targetDirectory)) { throw new ArgumentException( "The provided argument is null, an empty string or only consists of whitespace.", nameof(targetDirectory)); } string actualName = StringUtility.RemoveFileExtension(megArchiveName); MegFileHolder megFileHolder = new MegFileHolder(targetDirectory, actualName); foreach ((string key, string value) in packedFileNameToAbsoluteFilePathsMap) { megFileHolder.Content.Add(new MegFileDataEntry(key, value)); } MegFileBuilder builder = new MegFileBuilder(m_fileSystem); MegFile megFile = builder.FromHolder(megFileHolder, out IList <string> filesToStream); string writePath = m_fileSystem.Path.Combine(megFileHolder.FilePath, megFileHolder.FullyQualifiedName); CreateTargetDirectoryIfNotExists(megFileHolder.FilePath); using (BinaryWriter writer = new BinaryWriter(m_fileSystem.FileStream.Create(writePath, FileMode.Create, FileAccess.Write, FileShare.None))) { writer.Write(megFile.ToBytes()); } foreach (string file in filesToStream) { using Stream readStream = m_fileSystem.File.OpenRead(file); using Stream writeStream = m_fileSystem.FileStream.Create(writePath, FileMode.Append, FileAccess.Write, FileShare.None); byte[] buffer = new byte[BUFFER_SIZE]; int bytesRead; while ((bytesRead = readStream.Read(buffer, 0, buffer.Length)) > 0) { writeStream.Write(buffer, 0, bytesRead); } } }
public void FromHolder_Test__FileHeaderIsBinaryEquivalent() { MegFileHolder megFileHolder = new MegFileHolder(BASE_PATH, "test"); megFileHolder.Content.Add(new MegFileDataEntry("data/xml/campaignfiles.xml")); megFileHolder.Content.Add(new MegFileDataEntry("data/xml/gameobjectfiles.xml")); MegFileBuilder builder = new MegFileBuilder(m_fileSystem); MegFile megFile = builder.FromHolder(megFileHolder); Assert.IsNotNull(megFile); m_fileSystem.File.WriteAllBytes(m_fileSystem.Path.Combine(BASE_PATH, megFileHolder.FileName + "." + megFileHolder.FileType.FileExtension), megFile.ToBytes()); var f = m_fileSystem.File.ReadAllBytes(m_fileSystem.Path.Combine(BASE_PATH, megFileHolder.FileName + "." + megFileHolder.FileType.FileExtension)); }
public void FromHolder_Test__FileHeaderIsConsistent() { MegFileHolder megFileHolder = new MegFileHolder(BASE_PATH, "test"); megFileHolder.Content.Add(new MegFileDataEntry("data/xml/campaignfiles.xml")); megFileHolder.Content.Add(new MegFileDataEntry("data/xml/gameobjectfiles.xml")); MegFileBuilder builder = new MegFileBuilder(m_fileSystem); MegFile megFile = builder.FromHolder(megFileHolder); Assert.IsNotNull(megFile); Assert.IsNotNull(megFile.Header); Assert.IsNotNull(megFile.FileContentTable); Assert.IsNotNull(megFile.FileNameTable); Assert.AreEqual(2u, megFile.Header.NumFiles); Assert.AreEqual(2u, megFile.Header.NumFileNames); Assert.AreEqual(40, megFile.FileContentTable.Size); Assert.AreEqual(58, megFile.FileNameTable.Size); Assert.IsTrue(megFile.FileNameTable.MegFileNameTableRecords[0].FileName.Equals("data/xml/gameobjectfiles.xml", StringComparison.InvariantCultureIgnoreCase)); Assert.IsTrue(megFile.FileNameTable.MegFileNameTableRecords[1].FileName.Equals("data/xml/campaignfiles.xml", StringComparison.InvariantCultureIgnoreCase)); }
public void FromHolder_Test__FileHeaderIsBinaryEquivalent() { MegFileHolder megFileHolder = new MegFileHolder(TestConstants.BASE_PATH, "FromHolder_Test__FileHeaderIsBinaryEquivalent"); megFileHolder.Content.Add(new MegFileDataEntry("data/xml/campaignfiles.xml", TestConstants.FILE_PATH_CAMPAIGNFILES)); megFileHolder.Content.Add(new MegFileDataEntry("data/xml/gameobjectfiles.xml", TestConstants.FILE_PATH_GAMEOBJECTFILES)); MegFileBuilder builder = new MegFileBuilder(m_fileSystem); MegFile megFile = builder.FromHolder(megFileHolder); Assert.IsNotNull(megFile); m_fileSystem.File.WriteAllBytes( m_fileSystem.Path.Combine(TestConstants.BASE_PATH, megFileHolder.FullyQualifiedName), megFile.ToBytes()); byte[] readMegFile = m_fileSystem.File.ReadAllBytes(m_fileSystem.Path.Combine(TestConstants.BASE_PATH, megFileHolder.FullyQualifiedName)); Assert.AreEqual(TestConstants.CONTENT_MEG_FILE_HEADER.Length, readMegFile.Length); for (int i = 0; i < TestConstants.CONTENT_MEG_FILE_HEADER.Length; i++) { Assert.AreEqual(TestConstants.CONTENT_MEG_FILE_HEADER[i], readMegFile[i]); } }