/// <summary> /// Экспортирует файл из архива /// </summary> /// <param name="entry"></param> /// <param name="destination"></param> public void ExtractFile(GameFile entry, string destination) { Stream stream = entry.GetStream(FileMode.Open, FileAccess.Read); FileStream destinationFile = new FileStream(destination, FileMode.Create, FileAccess.Write); byte[] buf = new byte[SECTOR_SIZE]; while (stream.Position < stream.Length) { int read = stream.Read(buf, 0, SECTOR_SIZE); destinationFile.Write(buf, 0, read); } destinationFile.Flush(); destinationFile.Close(); stream.Close(); }
/// <summary> /// Deletes <see cref="GameFile"/> from the current <see cref="ArchiveFile"/> /// </summary> /// <summary xml:lang="ru"> /// Удаляет файл <see cref="GameFile"/> из текущего архива <see cref="ArchiveFile"/> /// </summary> /// <param name="entry"><see cref="GameFile"/> to be deleted</param> /// <param name="entry" xml:lang="ru">Файл <see cref="GameFile"/>, который необходимо удалить</param> public void DeleteFile(GameFile entry) { // We don't really know if we need to actually remove the file itself. // Maybe it is not needed here and we can just remove entry // just like in regular file system. // I'll leave this code commented here. Maybe we'll do this as a feature // with a flag. Who knows. /*Stream destinationStream = GetStream(FileMode.Open, FileAccess.Write); destinationStream.Seek(entry.Offset, SeekOrigin.Begin); while (destinationStream.Position < entry.Offset + entry.Length) { byte[] buf = new byte[SECTOR_SIZE]; destinationStream.Write(buf, 0, SECTOR_SIZE); } destinationStream.Close();*/ DeleteFileEntry(entry); }
/// <summary> /// Inserts new <see cref="GameFile"/> into current <see cref="ArchiveFile"/> /// </summary> /// <summary xml:lang="ru"> /// Добавляет новый файл <see cref="GameFile"/> в текущий архив <see cref="ArchiveFile"/> /// </summary> /// <param name="sourceFile"><see cref="GameFile"/> to be inserted into the <see cref="ArchiveFile"/></param> /// <param name="sourceFile" xml:lang="ru">Файл <see cref="GameFile"/>, который необходимо добавить в архив <see cref="ArchiveFile"/></param> public void InsertFile(GameFile sourceFile) { int offset = CalculateOffsetForNewEntry(); AddNewFileEntry(offset, sourceFile); Stream sourceStream = sourceFile.GetStream(FileMode.Open, FileAccess.Read); Stream destinationStream = GetStream(FileMode.Open, FileAccess.Write); byte[] buf; destinationStream.Seek(offset, SeekOrigin.Begin); while (sourceStream.Position < sourceStream.Length) { buf = new byte[SECTOR_SIZE]; int read = sourceStream.Read(buf, 0, SECTOR_SIZE); destinationStream.Write(buf, 0, SECTOR_SIZE); } destinationStream.Flush(); destinationStream.Close(); sourceStream.Close(); }
/// <summary> /// Deletes the table of contents entry for the <see cref="GameFile"/> from the current <see cref="ArchiveFile"/> /// </summary> /// <summary xml:lang="ru"> /// Удаляет запись о файле <see cref="GameFile"/> из текущего архива <see cref="ArchiveFile"/> /// </summary> /// <param name="file"><see cref="GameFile"/> which entry needs to be deleted</param> /// <param name="file" xml:lang="ru">Файл <see cref="GameFile"/>, запись которого необходимо удалить</param> public abstract void DeleteFileEntry(GameFile file);
/// <summary> /// Adds new table of contents entry for the new <paramref name="file"/> in defined <paramref name="offset"/> to the <see cref="ArchiveFile"/> /// </summary> /// <summary xml:lang="ru"> /// Добавляет новую запись о файле <paramref name="file"/> в таблицу размещения файлов в архиве <see cref="ArchiveFile"/> с заданным смещением <paramref name="offset"/> /// </summary> /// <param name="offset">Starting offset of a <paramref name="file"/></param> /// <param name="offset" xml:lang="ru">Смещение начала файла <paramref name="file"/></param> /// <param name="file"><see cref="GameFile"/> that needs new entry to be defined</param> /// <param name="file" xml:lang="ru">Файл <see cref="GameFile"/>, запись о котором необходимо добавить в таблицу</param> /// <returns><see cref="GameFile"/> entry for a new file</returns> public abstract GameFile AddNewFileEntry(int offset, GameFile file);
/// <summary> /// Renames <paramref name="entry"/> to <paramref name="newName"/> in the current <see cref="ArchiveFile"/> /// </summary> /// <summary xml:lang="ru"> /// Переименовывает файл <paramref name="entry"/> в <paramref name="newName"/> в текущем архиве <see cref="ArchiveFile"/> /// </summary> /// <param name="entry"><see cref="GameFile"/> to be renamed</param> /// <param name="entry" xml:lang="ru">Файл <see cref="GameFile"/>, который необходимо переименовать</param> /// <param name="newName">New file name</param> /// <param name="newName" xml:lang="ru">Новое имя файла</param> /// <remarks> /// This function is not implemented yet. /// </remarks> /// <remarks xml:lang="ru"> /// Эта функция ещё не реализована. /// </remarks> public void RenameFile(GameFile entry, string newName) { }
/// <summary> /// Replaces <paramref name="oldEntry"/> in the <see cref="ArchiveFile"/> with new file <paramref name="newEntry"/> /// </summary> /// <summary xml:lang="ru"> /// Заменяет файл <paramref name="oldEntry"/> в архиве <see cref="ArchiveFile"/> на новый файл <paramref name="newEntry"/> /// </summary> /// <param name="oldEntry">Old <see cref="GameFile"/> in the <see cref="ArchiveFile"/> that needs to be replaced</param> /// <param name="oldEntry" xml:lang="ru">Старый файл <see cref="GameFile"/> в архиве <see cref="ArchiveFile"/>, который нужно заменить</param> /// <param name="newEntry">A replacement <see cref="GameFile"/> for the <paramref name="oldEntry"/></param> /// <param name="newEntry" xml:lang="ru">Новый файл <see cref="GameFile"/>, которым необходимо заменить <paramref name="oldEntry"/></param> /// <remarks> /// This function is not implemented yet. /// </remarks> /// <remarks xml:lang="ru"> /// Эта функция ещё не реализована. /// </remarks> public void ReplaceFile(GameFile oldEntry, GameFile newEntry) { }