Example #1
0
        private void btnSaveAs_Click(object sender, EventArgs e)
        {
            WXAPKG_FILE file = null;

            if (btnListView.Checked)
            {
                if (1 != lvwFileList.SelectedItems.Count)
                {
                    return;
                }

                file = lvwFileList.SelectedItems[0].Tag as WXAPKG_FILE;
            }
            else
            {
                if (null == tvwFileList.SelectedNode)
                {
                    return;
                }

                file = tvwFileList.SelectedNode.Tag as WXAPKG_FILE;
            }

            if (null == file)
            {
                return;
            }

            SaveFileAs(file);
        }
Example #2
0
        private void AddTreeNode(TreeNode tn_parent, string file_name, WXAPKG_FILE file)
        {
            TreeNode tn = null;

            string[] arr_path = file_name.Split("/".ToCharArray(), StringSplitOptions.RemoveEmptyEntries);
            if (tn_parent.Nodes.ContainsKey(arr_path[0]))
            {
                tn = tn_parent.Nodes[arr_path[0]];
            }
            else
            {
                tn      = new TreeNode(arr_path[0]);
                tn.Name = arr_path[0];
                tn_parent.Nodes.Add(tn);
            }

            file_name = string.Join("/", arr_path);
            if (file_name.IndexOf('/', 1) < 0)
            {
                tn.Tag         = file;
                tn.ToolTipText =
                    "大小:" + FormatCapability((UInt64)file.m_size) +
                    " 偏移:" + file.m_offset;
                return;
            }

            file_name = file_name.Substring(file_name.IndexOf('/', 1));
            AddTreeNode(tn, file_name, file);
        }
Example #3
0
        private void lvwFileList_SelectedIndexChanged(object sender, EventArgs e)
        {
            if (1 != lvwFileList.SelectedItems.Count)
            {
                return;
            }

            WXAPKG_FILE file = lvwFileList.SelectedItems[0].Tag as WXAPKG_FILE;

            if (null == file)
            {
                return;
            }

            btnSaveAs.Enabled = true;
            ShowFileContent(file);
        }
Example #4
0
        private void tvwFileList_AfterSelect(object sender, TreeViewEventArgs e)
        {
            if (null == e.Node ||
                e.Node.Nodes.Count > 0)
            {
                btnSaveAs.Enabled = false;
                return;
            }

            WXAPKG_FILE file = e.Node.Tag as WXAPKG_FILE;

            if (null == file)
            {
                return;
            }

            btnSaveAs.Enabled = true;
            ShowFileContent(file);
        }
Example #5
0
        private void SaveFileAs(WXAPKG_FILE file)
        {
            if ("" == txtWXAPKG.Text ||
                null == file)
            {
                return;
            }

            sfd.FileName = file.m_name.Substring(file.m_name.LastIndexOf('/') + 1);
            if (DialogResult.OK != sfd.ShowDialog())
            {
                return;
            }

            FileStream fs = null;

            try
            {
                fs = new FileStream(txtWXAPKG.Text, FileMode.Open, FileAccess.Read);

                byte[] b_content = new byte[file.m_size];
                fs.Seek((long)file.m_offset, SeekOrigin.Begin);
                fs.Read(b_content, 0, b_content.Length);
                fs.Close();

                fs = new FileStream(sfd.FileName, FileMode.Create, FileAccess.ReadWrite);
                fs.Write(b_content, 0, b_content.Length);

                MessageBox.Show("成功保存到:" + sfd.FileName);
            }
            catch (Exception ex)
            {
                MessageBox.Show(ex.ToString());
            }
            finally
            {
                if (null != fs)
                {
                    fs.Close();
                }
            }
        }
Example #6
0
        private void btnWXAPKG_Click(object sender, EventArgs e)
        {
            if (DialogResult.OK != ofd.ShowDialog())
            {
                return;
            }

            txtContent.Text = "";
            txtWXAPKG.Text  = ofd.FileName;
            lvwFileList.Items.Clear();
            tvwFileList.Nodes.Clear();

            // WXAPKG 格式:https://toutiao.io/posts/33fum8/preview

            FileStream fs = null;

            try
            {
                fs = new FileStream(txtWXAPKG.Text, FileMode.Open, FileAccess.Read);

                // 获取头部信息
                WXAPKG_HEADER header = new WXAPKG_HEADER();

                // 第一个标识,固定为 0xBE
                header.m_first_mark = (byte)fs.ReadByte();
                if (0xBE != header.m_first_mark)
                {
                    throw new Exception("文件第一个标识有误,非 WXAPKG 格式文件!");
                }

                // 版本号,0 -> 微信分发到客户端 1 -> 开发者上传到微信后台
                byte[] b_int = new byte[4];
                fs.Read(b_int, 0, b_int.Length);
                header.m_edition = IPAddress.NetworkToHostOrder(BitConverter.ToInt32(b_int, 0));

                // 索引段的长度
                fs.Read(b_int, 0, b_int.Length);
                header.m_index_info_length = IPAddress.NetworkToHostOrder(BitConverter.ToInt32(b_int, 0));

                // 数据段的长度
                fs.Read(b_int, 0, b_int.Length);
                header.m_body_info_length = IPAddress.NetworkToHostOrder(BitConverter.ToInt32(b_int, 0));

                // 第二个标识,固定为 0xED
                header.m_last_mark = (byte)fs.ReadByte();
                if (0xED != header.m_last_mark)
                {
                    throw new Exception("文件标识有误,非 WXAPKG 格式文件!");
                }

                // 文件数量
                fs.Read(b_int, 0, b_int.Length);
                header.m_file_count = IPAddress.NetworkToHostOrder(BitConverter.ToInt32(b_int, 0));

                tvwFileList.BeginUpdate();
                TreeNode tn_root = tvwFileList.Nodes.Add("/");

                lvwFileList.BeginUpdate();

                // 获取每个文件的信息
                for (int i = 0; i < header.m_file_count; i++)
                {
                    WXAPKG_FILE file = new WXAPKG_FILE();

                    // 文件长度
                    fs.Read(b_int, 0, b_int.Length);
                    file.m_name_length = IPAddress.NetworkToHostOrder(BitConverter.ToInt32(b_int, 0));

                    if (file.m_name_length > 255)
                    {
                        throw new Exception("错误的文件长度!");
                    }

                    // 文件名
                    byte[] b_name = new byte[file.m_name_length];
                    fs.Read(b_name, 0, b_name.Length);
                    file.m_name = Encoding.UTF8.GetString(b_name);

                    // 偏移
                    fs.Read(b_int, 0, b_int.Length);
                    file.m_offset = IPAddress.NetworkToHostOrder(BitConverter.ToInt32(b_int, 0));

                    // 大小
                    fs.Read(b_int, 0, b_int.Length);
                    file.m_size = IPAddress.NetworkToHostOrder(BitConverter.ToInt32(b_int, 0));

                    // 添加到列表框
                    ListViewItem lvi = new ListViewItem(file.m_name);
                    lvi.SubItems.Add(FormatCapability((UInt64)file.m_size));
                    lvi.SubItems.Add(file.m_offset.ToString());
                    lvi.Tag = file;

                    lvwFileList.Items.Add(lvi);

                    // 添加到树形框
                    AddTreeNode(tn_root, file.m_name, file);
                }

                lvwFileList.AutoResizeColumns(ColumnHeaderAutoResizeStyle.ColumnContent);
                lvwFileList.EndUpdate();

                tvwFileList.ExpandAll();
                tvwFileList.EndUpdate();
            }
            catch (Exception ex)
            {
                MessageBox.Show(ex.ToString());
            }
            finally
            {
                if (null != fs)
                {
                    fs.Close();
                }
            }
        }
Example #7
0
        private void ShowFileContent(WXAPKG_FILE file)
        {
            if ("" == txtWXAPKG.Text ||
                null == file)
            {
                return;
            }

            FileStream fs = null;

            try
            {
                fs = new FileStream(txtWXAPKG.Text, FileMode.Open, FileAccess.Read);

                byte[] b_content = new byte[file.m_size];
                fs.Seek((long)file.m_offset, SeekOrigin.Begin);
                fs.Read(b_content, 0, file.m_size);
                fs.Close();

                string file_name = file.m_name.ToLower();
                if (file_name.EndsWith(".js") ||
                    file_name.EndsWith(".json"))
                {
                    string content = Encoding.UTF8.GetString(b_content);
                    if (btnBeautifyJS.Checked)
                    {
                        JSBeautifyOptions jsbo = new JSBeautifyOptions();
                        JSBeautify        jsb  = new JSBeautify(content, jsbo);
                        content = jsb.GetResult();
                    }

                    txtContent.Text = content;
                    txtContent.BringToFront();
                    tsContent.Enabled     = true;
                    btnBeautifyJS.Enabled = true;
                }
                else if (file_name.EndsWith(".png") ||
                         file_name.EndsWith(".jpg") ||
                         file_name.EndsWith(".gif") ||
                         file_name.EndsWith(".bmp"))
                {
                    MemoryStream ms  = new MemoryStream(b_content);
                    Bitmap       bmp = (Bitmap)Bitmap.FromStream(ms);
                    ms.Close();

                    picPreview.BackgroundImage = bmp;
                    picPreview.BringToFront();
                    tsContent.Enabled = false;
                }
                else
                {
                    string content = Encoding.UTF8.GetString(b_content);
                    txtContent.Text = content;
                    txtContent.BringToFront();
                    tsContent.Enabled     = true;
                    btnBeautifyJS.Enabled = false;
                }
            }
            catch (Exception ex)
            {
                MessageBox.Show(ex.ToString());
            }
            finally
            {
                if (null != fs)
                {
                    fs.Close();
                }
            }
        }