public bool ExtractFiles(List <string> names, string folder) { var bp = new BackgroundProgress(); var bw = bp.backgroundWorker1; bool result = true; bw.DoWork += (sender, ev) => { string basePath = folder; int count = 0; double one_file_in_progress_line = 1.0 / names.Count; foreach (var path in names) { if (path != null) { PackedFile.VoidInt upd = (p) => { bw.ReportProgress((int)(((double)count / names.Count * 100) + (p * one_file_in_progress_line))); }; Files[path].OnProgress += upd; if (!Files[path].ExtractFile(basePath)) { Files[path].OnProgress -= upd; result = false; return; } Files[path].OnProgress -= upd; } count++; bw.ReportProgress((int)((double)count / names.Count * 100)); if (bw.CancellationPending) { result = false; return; } } }; bw.RunWorkerAsync(); bp.ShowDialog(); if (result) { Utils.ShowMessage("Complete!", "Progress"); } return(result); }
public bool PackFiles(string out_pck, List <FileToPack> files, int alignment, PCKVersion godotVersion) { var bp = new BackgroundProgress(); var bw = bp.backgroundWorker1; bool result = false; bw.DoWork += (sender, ev) => { try { if (File.Exists(out_pck)) { File.Delete(out_pck); } } catch (Exception e) { MessageBox.Show(e.Message, "Error"); result = false; return; } BinaryWriter writer = null; try { writer = new BinaryWriter(File.OpenWrite(out_pck)); } catch (Exception e) { MessageBox.Show(e.Message, "Error"); result = false; return; } try { writer.Write(Program.PCK_MAGIC); writer.Write(godotVersion.PackVersion); writer.Write(godotVersion.Major); writer.Write(godotVersion.Minor); writer.Write(godotVersion.Revision); for (int i = 0; i < 16; i++) { writer.Write((int)0); // reserved } ; // write the index writer.Write((int)files.Count); long total_size = 0; // write pck header foreach (var file in files) { var str = Encoding.UTF8.GetBytes(file.Path).ToList(); writer.Write((int)str.Count); // write str size beacause of original function "store_pascal_string" store size and after actual data writer.Write(str.ToArray()); file.Offset_Offset = writer.BaseStream.Position; writer.Write((long)0); // offset writer.Write((long)file.Size); // size total_size += file.Size; // for progress bar // # empty md5 writer.Write((int)0); writer.Write((int)0); writer.Write((int)0); writer.Write((int)0); } ; total_size += writer.BaseStream.Position; long ofs = writer.BaseStream.Position; ofs = _align(ofs, alignment); _pad(writer, (int)(ofs - writer.BaseStream.Position)); const int buf_max = 65536; // write actual files data int count = 0; foreach (var file in files) { // cancel packing if (bw.CancellationPending) { CloseAndDeleteFile(writer, out_pck); result = false; return; } BinaryReader src = new BinaryReader(File.OpenRead(file.OriginalPath)); long to_write = file.Size; while (to_write > 0) { var read = src.ReadBytes(buf_max); writer.Write(read); to_write -= read.Length; bw.ReportProgress((int)((double)writer.BaseStream.Position / total_size * 100)); // update progress bar // cancel packing if (bw.CancellationPending) { src.Close(); CloseAndDeleteFile(writer, out_pck); result = false; return; } } ; long pos = writer.BaseStream.Position; writer.BaseStream.Seek(file.Offset_Offset, SeekOrigin.Begin); // go back to store the writer's offset writer.Write((long)ofs); writer.BaseStream.Seek(pos, SeekOrigin.Begin); ofs = _align(ofs + file.Size, alignment); _pad(writer, (int)(ofs - pos)); src.Close(); count += 1; } ; } catch (Exception e) { MessageBox.Show(e.Message, "Error"); CloseAndDeleteFile(writer, out_pck); result = false; return; } writer.Close(); result = true; return; }; bw.RunWorkerAsync(); bp.ShowDialog(); if (result) { Utils.ShowMessage("Complete!", "Progress"); } return(result); }