Как вариант использовать лист ваших объектов, записывать его и при добавлении, читаем, добавляем и перезаписываем. Вот накидал пример, используя лист object'ов, в принципе можете и этот пример использовать просто потом лист object'ов преобразовывайте в лист Book'ов
static void Main()
{
addObject(123, @"D:\out.bin");
addObject(new StringBuilder("lalalla"), @"D:\out.bin");
addObject(new Point(10,20), @"D:\out.bin");
var test = getObjects(@"D:\out.bin");//[int(123),string(lalalal), Point(10,20)]
}
public static void addObject(object obj,string path){
BinaryFormatter formatter = new BinaryFormatter();
List<object> objs = new List<object>();
if (File.Exists(path))
using (FileStream fs = File.Open(path, FileMode.Open))
objs = (List<object>)formatter.Deserialize(fs);
objs.Add(obj);
using (FileStream fs = File.Create(path))
formatter.Serialize(fs,objs);
}
public static List<object> getObjects(string path){
BinaryFormatter formatter = new BinaryFormatter();
List<object> objs = new List<object>();
if (File.Exists(path))
using (FileStream fs = File.Open(path, FileMode.Open))
objs = (List<object>)formatter.Deserialize(fs);
return objs;
}
P.S. С append'ом точно ничего не получится. C# записывает всё в своем формате, описывая типы и данные всё вместе. С append'ом только если вы придумаете свой формат и напишите методы сериализации\десериализации хотя-бы например для своего класса.