Here are the examples of the csharp api System.Collections.Generic.ICollection.Add(Xfsa2DirectoryEntry) taken from open source projects. By voting up you can indicate which examples are most useful and appropriate.
1 Examples
19
Source : XFSA2.cs
with GNU General Public License v3.0
from FanTranslatorsInternational
with GNU General Public License v3.0
from FanTranslatorsInternational
private void BuildTables(IEnumerable<XfsaArchiveFileInfo<Xfsa2FileEntry>> files,
out IList<Xfsa2DirectoryEntry> directoryEntries, out IList<uint> directoryHashes,
out IList<XfsaArchiveFileInfo<Xfsa2FileEntry>> fileEntries, out Stream nameStream)
{
var groupedFiles = files.OrderBy(x => x.FilePath.GetDirectory())
.GroupBy(x => x.FilePath.GetDirectory())
.ToArray();
var crc32 = Crc32.Default;
var sjis = Encoding.GetEncoding("SJIS");
nameStream = new MemoryStream();
using var nameBw = new BinaryWriterX(nameStream, true);
var fileInfos = new List<XfsaArchiveFileInfo<Xfsa2FileEntry>>();
directoryEntries = new List<Xfsa2DirectoryEntry>();
directoryHashes = new List<uint>();
var fileOffset = 0;
foreach (var fileGroup in groupedFiles)
{
var fileIndex = fileInfos.Count;
var fileGroupEntries = fileGroup.ToArray();
// Add directory entry first
var directoryNameOffset = (int)nameBw.BaseStream.Position;
var directoryName = fileGroup.Key.ToRelative().FullName;
if (!string.IsNullOrEmpty(directoryName))
directoryName += "/";
nameBw.WriteString(directoryName, sjis, false);
var hash = crc32.ComputeValue(directoryName.ToLower(), sjis);
var newDirectoryEntry = new Xfsa2DirectoryEntry
{
crc32 = string.IsNullOrEmpty(fileGroup.Key.ToRelative().FullName) ? 0xFFFFFFFF : hash,
directoryCount = (short)groupedFiles.Count(gf => fileGroup.Key != gf.Key && gf.Key.IsInDirectory(fileGroup.Key, false)),
fileCount = (short)fileGroupEntries.Length,
FirstFileIndex = (short)fileIndex,
directoryNameOffset = directoryNameOffset,
fileNameStartOffset = (int)nameBw.BaseStream.Position
};
if (newDirectoryEntry.crc32 != 0xFFFFFFFF)
directoryHashes.Add(newDirectoryEntry.crc32);
directoryEntries.Add(newDirectoryEntry);
// Write file names in alphabetic order
foreach (var fileEntry in fileGroupEntries)
{
fileEntry.Entry.NameOffset = (int)(nameBw.BaseStream.Position - newDirectoryEntry.fileNameStartOffset);
fileEntry.Entry.crc32 = crc32.ComputeValue(fileEntry.FilePath.GetName().ToLower(), sjis);
fileEntry.Entry.FileOffset = fileOffset;
fileEntry.Entry.FileSize = (int)fileEntry.FileSize;
fileOffset = (int)((fileOffset + fileEntry.FileSize + 15) & ~15);
nameBw.WriteString(fileEntry.FilePath.GetName(), sjis, false);
}
// Add file entries in order of ascending hash
fileInfos.AddRange(fileGroupEntries.OrderBy(x => x.Entry.crc32));
}
fileEntries = fileInfos;
// Order directory entries by hash and set directoryIndex accordingly
var directoryIndex = 0;
directoryEntries = directoryEntries.OrderBy(x => x.crc32).Select(x =>
{
x.FirstDirectoryIndex = (short)directoryIndex;
directoryIndex += x.directoryCount;
return x;
}).ToList();
}