예제 #1
0
        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();
            }
        }
예제 #2
0
        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);
                }
        }
예제 #3
0
        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);
        }
예제 #4
0
        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();
            }
        }
예제 #5
0
 public void Save(StreamInfo output, PhysicalDirectoryNode fs, int versionIndex = 0)
 {
     _format.Save(output.FileData);
 }
예제 #6
0
 public void Save(StreamInfo output, PhysicalDirectoryNode fileSystem, int versionIndex = 0)
 {
     throw new NotImplementedException();
 }
예제 #7
0
 public void Save(StreamInfo primaryFile, PhysicalDirectoryNode node, int versionIndex = 0)
 {
     _format.Save(primaryFile.FileData);
 }