private void PreviewFileFromPakEntryInfo(PakEntryInfo pakEntry) { using (var pr = new PakReader(pakEntry.PakFile)) { switch (GetPreviewTypeFromFilename(pakEntry.EntryFilename)) { case PreviewType.Text: using (var ms = new MemoryStream(pr.GetFile(pakEntry.EntryFilename))) { var text = new StreamReader(ms).ReadToEnd(); ShowTextViewer(text); } break; case PreviewType.Html: using (var ms = new MemoryStream(pr.GetFile(pakEntry.EntryFilename))) { try { var text = EncryptedHtml.DecodeToString(pakEntry.EntryFilename, ms); ShowTextViewer(text); } catch { // maybe not encrypted, show raw text ms.Seek(0, SeekOrigin.Begin); var text = new StreamReader(ms).ReadToEnd(); ShowTextViewer(text); } } break; case PreviewType.Xml: using (var ms = new MemoryStream(pr.GetFile(pakEntry.EntryFilename))) { var text = new StreamReader(new AionXmlStreamReader(ms, true)).ReadToEnd(); ShowTextViewer(text); } break; case PreviewType.Image: using (var ms = new MemoryStream(pr.GetFile(pakEntry.EntryFilename))) { ShowImageViewer(ms); } break; case PreviewType.Cgf: using (var ms = new MemoryStream(pr.GetFile(pakEntry.EntryFilename))) { ShowCgfViewer(new CgfLoader(ms)); } break; default: break; } } }
/// <summary> /// Extract all files from absolute path. /// </summary> /// <param name="fullpath">Absolute path to a file in a PAK archive.</param> public void ExtractFile(string fullpath) { string pakFilePath = Regex.Match(fullpath, ".*.pak").Value; string fileMatch = Path.GetFileName(Regex.Replace(fullpath, ".*.pak", "").Trim()); PakReader?.Dispose(); PakReader = new PakReader(pakFilePath); byte[] fileBytes = PakReader.GetFile(fileMatch); Encdec.ConsoleInfo.LogWait(Level.Info, "{Extract} " + fileMatch); if (fileBytes != null) { FileInfo f = new FileInfo(Path.Combine(Program.Arguments.Input, Path.GetFileNameWithoutExtension(pakFilePath), fileMatch).Replace("/", "\\")); f.Directory.Create(); if (!File.Exists(f.FullName)) { File.WriteAllBytes(f.FullName, fileBytes); } else { int idx = 1; string newPath; while (File.Exists(newPath = Path.Combine(f.Directory.FullName, Path.GetFileNameWithoutExtension(f.Name) + "_" + idx + f.Extension))) { idx++; } File.WriteAllBytes(newPath, fileBytes); } } }
private void M_treeView_ItemDrag(object sender, ItemDragEventArgs e) { var node = e.Item as TreeNode; if (node == null) { return; } // TODO - drag start immediately copies the file, even if dragging within the app. should only copy if needed. // TODO - drag directory List <string> selection = new List <string>(); string tempfile = null; string tempdir = null; var file = node.Tag as FileInfo; if (file != null) { // just copy the file selection.Add(file.FullName); } else { var pei = node.Tag as PakEntryInfo; if (pei != null) { if (string.IsNullOrWhiteSpace(pei.EntryFilename) || pei.EntryFilename.EndsWith("\\") || pei.EntryFilename.EndsWith("/")) { return; } tempdir = Path.Combine(Path.GetTempPath(), Guid.NewGuid().ToString()); tempfile = Path.Combine(tempdir, pei.EntryFilename.Replace("/", "\\")); tempdir = Path.GetDirectoryName(tempfile); Directory.CreateDirectory(tempdir); var pr = new PakReader(pei.PakFile); File.WriteAllBytes(tempfile, pr.GetFile(pei.EntryFilename)); selection.Add(tempfile); } } if (!selection.Any()) { return; } DataObject data = new DataObject(DataFormats.FileDrop, selection.ToArray()); DoDragDrop(data, DragDropEffects.Copy); if (tempfile != null) { try { File.Delete(tempfile); Directory.Delete(tempdir); } catch { } } }