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 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(); } }