private void ReplaceFilesInFolder(string newSaveLocation, PhysicalDirectoryNode physicalFs, string root) { // Loop through all directories foreach (var dir in physicalFs.EnumerateDirectories()) { ReplaceFilesInFolder(newSaveLocation, (PhysicalDirectoryNode)physicalFs.GetDirectoryNode(dir.RelativePath), root); } // Update files of this directory foreach (var file in physicalFs.EnumerateFiles()) { var relativeFileName = file.RelativePath; physicalFs.AddFile(relativeFileName); var openedFile = physicalFs.GetFileNode(relativeFileName).Open(); if (!Directory.Exists(Path.Combine(newSaveLocation, Path.GetDirectoryName(relativeFileName) ?? string.Empty))) { Directory.CreateDirectory(Path.Combine(newSaveLocation, Path.GetDirectoryName(relativeFileName) ?? string.Empty)); } var createdFile = File.Create(Path.Combine(newSaveLocation, relativeFileName)); openedFile.CopyTo(createdFile); createdFile.Close(); openedFile.Close(); } }
public void Save(StreamInfo output, PhysicalDirectoryNode fileSystem, int versionIndex = 0) { fileSystem.AddFile("archive.data"); var dataStream = fileSystem.GetFileNode("archive.data").Open(); using (var bwData = new BinaryWriterX(dataStream, false)) using (var bw = new BinaryWriterX(output.FileData, LeaveOpen)) { var header = new Header { fileCount = Files.Count }; var entries = new List <FileEntry>(); var offset = 0; foreach (var file in Files) { file.FileData.CopyTo(bwData.BaseStream); entries.Add(new FileEntry { offset = offset, size = (int)file.FileData.Length, name = Path.GetFileName(file.FileName), nameLength = Encoding.UTF8.GetByteCount(Path.GetFileName(file.FileName)) }); offset += (int)file.FileData.Length; } bw.WriteType(header); bw.WriteMultiple(entries); } }
private KoreFileInfo SaveFile(KoreSaveInfo ksi, bool firstIteration) { var kfi = ksi.Kfi; var tempFolder = ksi.TempFolder; if (!string.IsNullOrEmpty(ksi.NewSaveFile) && File.Exists(ksi.NewSaveFile) && File.GetAttributes(ksi.NewSaveFile).HasFlag(FileAttributes.Directory)) { throw new InvalidOperationException($"{nameof(ksi.NewSaveFile)} needs to be a file path."); } var guid = Guid.NewGuid().ToString(); // Get FullPath tree FullPathNode fullPathTree = null; if (firstIteration) { fullPathTree = CreateFullPathTree(ksi.Kfi); } // Save all children first, if they exist SaveChildren(ksi); // Save data with the adapter var fs = new PhysicalDirectoryNode(guid, Path.GetFullPath(ksi.TempFolder)); SaveWithAdapter(ksi, fs); // Close KFIs CloseFile(kfi, kfi.ParentKfi != null, firstIteration); // Replace data in parent KFI or physical folder fs = new PhysicalDirectoryNode("", Path.Combine(Path.GetFullPath(ksi.TempFolder), guid)); if (kfi.ParentKfi != null) { ReplaceFilesInAdapter(kfi.ParentKfi.Adapter as IArchiveAdapter, fs, fs.RootPath); } else { var newLocation = string.IsNullOrEmpty(ksi.NewSaveFile) ? kfi.FullPath : ksi.NewSaveFile; var newSaveDir = Path.GetDirectoryName(newLocation); ReplaceFilesInFolder(newSaveDir, fs, fs.RootPath); UpdateFullPathTree(fullPathTree, Path.GetDirectoryName(kfi.FullPath), newSaveDir); } // Reopen files recursively from parent to child return(firstIteration ? ReopenFiles(kfi.ParentKfi ?? kfi, fullPathTree, tempFolder, kfi.ParentKfi != null) : null); }
private void SaveWithAdapter(KoreSaveInfo ksi, PhysicalDirectoryNode fs) { var kfi = ksi.Kfi; kfi.Adapter.LeaveOpen = false; var newFilename = string.IsNullOrEmpty(ksi.NewSaveFile) ? Path.GetFileName(kfi.StreamFileInfo.FileName) : Path.GetFileName(ksi.NewSaveFile); fs.AddFile(newFilename); var fileNode = fs.GetFileNode(newFilename); var streamInfo = new StreamInfo { FileData = fileNode.Open(), FileName = newFilename }; (kfi.Adapter as ISaveFiles)?.Save(streamInfo, fs, ksi.Version); if (streamInfo.FileData.CanRead) { streamInfo.FileData.Dispose(); } }
public void Save(StreamInfo output, PhysicalDirectoryNode fs, int versionIndex = 0) { _format.Save(output.FileData); }
public void Save(StreamInfo output, PhysicalDirectoryNode fileSystem, int versionIndex = 0) { throw new NotImplementedException(); }
public void Save(StreamInfo primaryFile, PhysicalDirectoryNode node, int versionIndex = 0) { _format.Save(primaryFile.FileData); }