public bool Persist(IFileSystem fileSystem, string filepath) { using (AutoPause()) { if (File != null) { // We already are persisted! throw new InvalidOperationException("This machine is already persisted!"); } if (String.IsNullOrEmpty(filepath)) { throw new ArgumentException("Invalid filepath.", nameof(filepath)); } ITextFile textFile = fileSystem.OpenTextFile(filepath); MachineFile machineFile = new MachineFile(textFile, _history); machineFile.WriteHistory(_name); File = machineFile; PersistantFilepath = filepath; return(true); } }
/// <summary> /// Rewrites the machine file according to the current in-memory representation of the timeline. /// </summary> /// <param name="diffsEnabled">Enable calculation of diffs. Setting this to true can cause compacting to take a long time.</param> /// <remarks> /// This is useful for compacting the size of the machine file, due to the fact that bookmark and timeline deletions don't actually /// remove anything from the machine file, but simply log the fact they happened. /// </remarks> /// public void Compact(IFileSystem fileSystem) { // Only allow closed machines to compact! if (!CanCompact()) { throw new Exception("Can't compact an open machine!"); } string oldFilepath = PersistantFilepath; string newFilepath = oldFilepath + ".tmp"; MachineFileInfo info = null; using (ITextFile textFile = fileSystem.OpenTextFile(oldFilepath)) { info = MachineFile.Read(textFile); } using (ITextFile textFile = fileSystem.OpenTextFile(newFilepath)) using (MachineFile writer = new MachineFile(textFile, info.History)) { writer.WriteHistory(info.Name); } fileSystem.ReplaceFile(oldFilepath, newFilepath); }