[
  {
    "Id": "510031",
    "ThreadId": "231663",
    "Html": "<p>Hi everyone,</p>\r\n<p>I'm trying to find a C#&nbsp;example of Unzipping a file with progress.&nbsp; I'm not sure which&nbsp;of the ExtractExistingFileAction (Overwrite Silently, or InvokeExtractProgressEvent) I should be using.<br>I've seen several posts where other developers are using the Library with VB.NET however it's really confusing trying to convert the code to what I would need in C#.&nbsp; Could someone point me in the right direction please?&nbsp;</p>\r\n<p>Thanks,<br>Jim</p>",
    "PostedDate": "2010-10-20T09:52:53.11-07:00",
    "UserRole": null,
    "MarkedAsAnswerDate": null
  },
  {
    "Id": "511703",
    "ThreadId": "231663",
    "Html": "\r\n<p>Hey Jim,</p>\r\n<p>That's one example I apparently haven't written.&nbsp; There is an &quot;unzip with progressbar&quot; written in VB.&nbsp; There is a &quot;create zip with progressbar&quot; written in C#.&nbsp; But I don't think there is a simple &quot;unzip with progressbar&quot; in C#.&nbsp; I should\r\n write one. I'll put it on my list of things to do.</p>\r\n<p>To answer your questions, ExtractExistingFileAction is a property that specifies what DotNetZip will do when you extract a file that already exists in the filesystem.&nbsp; This isn't appropriate for use when driving a progress bar.&nbsp; It's really something\r\n for exceptional cases, and it allows your application to handle that exceptional case, flexibly.</p>\r\n<p>What you want is to set the <a href=\"http://cheeso.members.winisp.net/DotNetZipHelp/html/01318049-51bf-3876-e766-ad83e62fdcf5.htm\">\r\nExtractProgress </a>event.&nbsp;&nbsp;There are examples in the documentation showing how to use the ExtractProgress event from within C#, and a CONSOLE app.&nbsp; This is obviously not what you asked for, but it gets you pretty close to what you want.</p>\r\n<p>You could use the same approach as in the console examples, but rather than writing to the console during the progress event, simply update the Value of your progressbar.&nbsp; That will work but is simplistic.&nbsp; Here's why: normally in a Winforms app,\r\n you want to keep the user interface active, even as you are performing IO, like extracting a compressed zip file.&nbsp; Some zip files are really big and extracting can take a minute, ten minutes, an hour.&nbsp; In these cases, you want your application to\r\n remain responsive to button clicks, so the user could, for example, cancel the operation if he gets tired of waiting.</p>\r\n<p>Doing DotNetZip in WinForms programming, and one is tempted to put the zipfile extraction logic in the Button_Click event.&nbsp; But if you do this, the UI will freeze for the entire len gth of time it takes to extract the zip file.&nbsp; Bad manners.&nbsp;\r\n So what you need to do is use a BackgroundWorker, to perform the possibly lengthy job of extracting the zipfile.&nbsp; In the Button_Click event, kickoff the BackgroundWorker (if it is not already running, of course!).&nbsp; In the BG worker code, is where\r\n you should do the extraction of the zipfile.</p>\r\n<p>Why am I telling you all this?&nbsp; Well, if you use an&nbsp; ExtractProgress event in your extraction code that runs on the context of the background worker, you must not try to update the UI (like a progress bar) from that background thread.&nbsp; Huh?&nbsp;&nbsp;In\r\n Winforms, only one thread is permitted to update the UI, and when you use a BG worker, that worker logic does not run on the UI thread.&nbsp; (This is sort of the point, after all.&nbsp; We want the UI to remain responsive, so we avoid doing IO work on the\r\n UI thread).&nbsp; So what you need to do is call the background worker's ReportProgress method, inside the ExtractProgress event.&nbsp;&nbsp;Get it?&nbsp; And update the progressbar in the ReportProgress method.&nbsp; That insures that the progress&nbsp; bar\r\n gets updated only on the UI thread, as required.</p>\r\n<p>See this article for a writeup of how to do this: <a href=\"http://p3net.mvps.org/Topics/WinForms/BackgroundWorker.aspx\">\r\nhttp://p3net.mvps.org/Topics/WinForms/BackgroundWorker.aspx</a>&nbsp; This article doesn't use DotNetZip, but it covers progress bars in a winforms app, and a background worker.</p>\r\n<p>In the meantime I'll work on adding a&nbsp;functional example to DotNetZip that does just what you want.</p>\r\n<p>&nbsp;</p>\r\n",
    "PostedDate": "2010-10-24T06:26:10.457-07:00",
    "UserRole": null,
    "MarkedAsAnswerDate": null
  },
  {
    "Id": "512688",
    "ThreadId": "231663",
    "Html": "\r\n<p>Thanks for the quick reply Cheeso!&nbsp; :)&nbsp;&nbsp; I thought I had something working just before I got your reply but now I think I've gotten off on a tangent and between what I thought I had working and the code from that discussion on the background\r\n worker, I'm throughly confused now.<br>\r\nHere is the code I'm currently working with which&nbsp;I am sure I don't need everything in it:</p>\r\n<p><span style=\"font-size:x-small\"><span style=\"font-size:x-small\"></p>\r\n<p>private BackgroundWorker _zipBGWorker;<br>\r\nprivate delegate void ZipProgressEventHandler(ExtractProgressEventArgs e);<br>\r\nprivate delegate void ExtractEntryProgressEventHandler(ExtractProgressEventArgs e);</p>\r\n<p>private void DoExtract(string ZipToExtract)<br>\r\n{<br>\r\n&nbsp;object[] args = new object[3];<br>\r\n&nbsp;args[0] = ZipToExtract;<br>\r\n&nbsp;args[1] = ExtractPath;<br>\r\n&nbsp;_zipBGWorker = new BackgroundWorker();<br>\r\n&nbsp;_zipBGWorker.WorkerSupportsCancellation = false;<br>\r\n&nbsp;_zipBGWorker.WorkerReportsProgress = true;<br>\r\n&nbsp;_zipBGWorker.DoWork &#43;= new DoWorkEventHandler(_zipBGWorker_DoWork);<br>\r\n&nbsp;_zipBGWorker.RunWorkerCompleted &#43;= new RunWorkerCompletedEventHandler(_zipBGWorker_RunWorkerCompleted);<br>\r\n&nbsp;_zipBGWorker.ProgressChanged &#43;= new ProgressChangedEventHandler(_zipBGWorker_ProgressChanged);<br>\r\n&nbsp;_zipBGWorker.RunWorkerAsync(args);<br>\r\n&nbsp;this.Cursor = Cursors.WaitCursor;<br>\r\n}</p>\r\n<p>void _zipBGWorker_ProgressChanged(object sender, ProgressChangedEventArgs e)<br>\r\n{<br>\r\n&nbsp;progressBar1.Value = e.ProgressPercentage;<br>\r\n}</p>\r\n<p>void _zipBGWorker_RunWorkerCompleted(object sender, RunWorkerCompletedEventArgs e)<br>\r\n{<br>\r\n&nbsp;this.Close();<br>\r\n}</p>\r\n<p>private void _zipBGWorker_DoWork(object sender, DoWorkEventArgs e)<br>\r\n{<br>\r\n&nbsp;//bool extractCancelled = false;</p>\r\n<p>&nbsp;object[] args = (object[])e.Argument;<br>\r\n&nbsp;var list = args.Cast&lt;string&gt;().ToList();<br>\r\n&nbsp;string ZipToUnpack = list[0];<br>\r\n&nbsp;string extractDir = list[1];</p>\r\n<p>&nbsp;try<br>\r\n&nbsp;{<br>\r\n&nbsp;&nbsp;using (ZipFile zip = ZipFile.Read(ZipToUnpack))<br>\r\n&nbsp;&nbsp;{<br>\r\n&nbsp;&nbsp;&nbsp;SetProgressBarMax(zip.Entries.Count);<br>\r\n&nbsp;&nbsp;&nbsp;zip.ExtractProgress &#43;= new EventHandler&lt;ExtractProgressEventArgs&gt;(zip_ExtractProgress);<br>\r\n&nbsp;&nbsp;&nbsp;zip.ExtractAll(extractDir, ExtractExistingFileAction.OverwriteSilently);<br>\r\n&nbsp;&nbsp;}<br>\r\n&nbsp;}<br>\r\n&nbsp;catch (Exception ex)<br>\r\n&nbsp;{<br>\r\n&nbsp;&nbsp;MessageBox.Show(string.Format(&quot;There's been a problem extracting that zip file.&nbsp; {0}&quot;, ex.Message),\r\n<br>\r\n&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &quot;Error Extracting&quot;, MessageBoxButtons.OK, MessageBoxIcon.Exclamation, MessageBoxDefaultButton.Button1);<br>\r\n&nbsp;}<br>\r\n}</p>\r\n<p>void zip_ExtractProgress(object sender, ExtractProgressEventArgs e)<br>\r\n{<br>\r\n&nbsp;progressBar1.Value = Convert.ToInt32(100 * e.BytesTransferred / e.TotalBytesToTransfer);<br>\r\n}</p>\r\n<p>private void SetProgressBarMax(int n)<br>\r\n{<br>\r\n&nbsp;if (progressBar1.InvokeRequired)<br>\r\n&nbsp;{<br>\r\n&nbsp;&nbsp;progressBar1.Invoke(new Action&lt;int&gt;(SetProgressBarMax), new object[] { n });<br>\r\n&nbsp;}<br>\r\n&nbsp;else<br>\r\n&nbsp;{<br>\r\n&nbsp;&nbsp;progressBar1.Maximum = n;<br>\r\n&nbsp;&nbsp;progressBar1.Step = 1;<br>\r\n&nbsp;}<br>\r\n}</p>\r\n<p>private void StepEntryProgress(ExtractProgressEventArgs e)<br>\r\n{</p>\r\n<p>&nbsp;if (progressBar1.InvokeRequired)<br>\r\n&nbsp;{<br>\r\n&nbsp;&nbsp;progressBar1.Invoke(new ExtractEntryProgressEventHandler(this.StepEntryProgress), new object[] { e });<br>\r\n&nbsp;}<br>\r\n&nbsp;else<br>\r\n&nbsp;{<br>\r\n&nbsp;&nbsp;progressBar1.Value = Convert.ToInt32(100 * e.BytesTransferred / e.TotalBytesToTransfer);<br>\r\n&nbsp;}<br>\r\n}</p>\r\n</span></span>\r\n<p></p>\r\n",
    "PostedDate": "2010-10-26T06:15:46.327-07:00",
    "UserRole": null,
    "MarkedAsAnswerDate": null
  },
  {
    "Id": "512891",
    "ThreadId": "231663",
    "Html": "\r\n<div style=\"color:black; background-color:white\">\r\n<pre><span style=\"color:blue\">I finally got something working but I feel like I'm missing something or I'm doing more than I need to. Any thoughts?  :)</span></pre>\r\n<pre>&nbsp;</pre>\r\n<pre><span style=\"color:blue\">using</span> System;\r\n<span style=\"color:blue\">using</span> System.Collections;\r\n<span style=\"color:blue\">using</span> System.Collections.Generic;\r\n<span style=\"color:blue\">using</span> System.ComponentModel;\r\n<span style=\"color:blue\">using</span> System.Data;\r\n<span style=\"color:blue\">using</span> System.Linq;\r\n<span style=\"color:blue\">using</span> System.Text;\r\n<span style=\"color:blue\">using</span> System.Windows.Forms;\r\n<span style=\"color:blue\">using</span> Ionic.Zip;\r\n<span style=\"color:blue\">using</span> System.Threading;\r\n<span style=\"color:blue\">using</span> Microsoft.Win32;\r\n<span style=\"color:blue\">using</span> System.IO;\r\n<span style=\"color:blue\">using</span> test.saic.library;\r\n<span style=\"color:blue\">using</span> CTSDBExtractionApp.StringExtentions;\r\n\r\n\r\n<span style=\"color:blue\">namespace</span> CTSDB\r\n{\r\n    <span style=\"color:blue\">public</span> <span style=\"color:blue\">partial</span> <span style=\"color:blue\">class</span> FormProgress : Form\r\n    {\r\n\r\n        <span style=\"color:blue\">private</span> BackgroundWorker _zipBGWorker;\r\n        <span style=\"color:blue\">private</span> <span style=\"color:blue\">delegate</span> <span style=\"color:blue\">void</span> ZipProgressEventHandler(ExtractProgressEventArgs e);\r\n        <span style=\"color:blue\">private</span> <span style=\"color:blue\">delegate</span> <span style=\"color:blue\">void</span> ExtractEntryProgressEventHandler(ExtractProgressEventArgs e);\r\n\r\n        <span style=\"color:blue\">public</span> <span style=\"color:blue\">string</span> ExtractPath { <span style=\"color:blue\">get</span>; <span style=\"color:blue\">set</span>; }\r\n\r\n        <span style=\"color:green\">// Disable User Closing Form</span>\r\n        <span style=\"color:blue\">private</span> <span style=\"color:blue\">bool</span> AllowClose = <span style=\"color:blue\">false</span>;\r\n\r\n        <span style=\"color:blue\">public</span> FormProgress()\r\n        {\r\n            InitializeComponent();\r\n            SetTitle();\r\n        }\r\n\r\n        <span style=\"color:blue\">private</span> <span style=\"color:blue\">void</span> SetTitle()\r\n        {\r\n            <span style=\"color:blue\">this</span>.Text = <span style=\"color:#a31515\">&quot;CTS Database Decompression&quot;</span>;\r\n        }\r\n\r\n        <span style=\"color:blue\">private</span> <span style=\"color:blue\">void</span> GetMSSQLPath()\r\n        {\r\n            <span style=\"color:blue\">string</span> sKey = <span style=\"color:#a31515\">&quot;Software\\\\Microsoft\\\\Microsoft SQL Server\\\\CTSDB\\\\Setup&quot;</span>;\r\n            RegistryKey rk = Registry.LocalMachine;\r\n\r\n            <span style=\"color:blue\">try</span>\r\n            {\r\n                RegistryKey sk1 = rk.OpenSubKey(sKey);\r\n\r\n                <span style=\"color:blue\">string</span> sVal = (<span style=\"color:blue\">string</span>)sk1.GetValue(<span style=\"color:#a31515\">&quot;SQLPath&quot;</span>);\r\n                <span style=\"color:blue\">if</span> (sVal == <span style=\"color:blue\">null</span>)\r\n                {\r\n                    MessageBox.Show(<span style=\"color:#a31515\">&quot;Registry value &quot;</span> &#43; sKey &#43; <span style=\"color:#a31515\">&quot; not set.&quot;</span>,\r\n                                    <span style=\"color:#a31515\">&quot;CTS Database Extraction&quot;</span>, MessageBoxButtons.OK, MessageBoxIcon.Exclamation);\r\n                }\r\n\r\n                <span style=\"color:blue\">int</span> iVal;\r\n                <span style=\"color:blue\">bool</span> bConverted = Int32.TryParse(sVal.Right(1), <span style=\"color:blue\">out</span> iVal);\r\n                <span style=\"color:blue\">if</span> (bConverted &amp;&amp; iVal == 0)\r\n                {\r\n                    ExtractPath = sVal.Left(sVal.Length - 1) &#43; <span style=\"color:#a31515\">&quot;\\\\Data&quot;</span>;\r\n                }\r\n                <span style=\"color:blue\">else</span>\r\n                {\r\n                    ExtractPath = sVal &#43; <span style=\"color:#a31515\">&quot;\\\\Data&quot;</span>;\r\n                }\r\n\r\n            }\r\n            <span style=\"color:blue\">catch</span> (Exception e)\r\n            {\r\n                MessageBox.Show(<span style=\"color:#a31515\">&quot;Unable to open key &quot;</span> &#43; sKey &#43; <span style=\"color:#a31515\">&quot;: &quot;</span> &#43; e.Message,\r\n                                <span style=\"color:#a31515\">&quot;CTS Database Extraction&quot;</span>, MessageBoxButtons.OK, MessageBoxIcon.Exclamation);\r\n            }\r\n        }\r\n\r\n        <span style=\"color:blue\">private</span> <span style=\"color:blue\">void</span> Form1_Load(<span style=\"color:blue\">object</span> sender, EventArgs e)\r\n        {\r\n            GetMSSQLPath();\r\n            DoExtract(<span style=\"color:#a31515\">&quot;Cdrsqlbs.zip&quot;</span>);\r\n        }\r\n\r\n        <span style=\"color:blue\">private</span> <span style=\"color:blue\">void</span> DoExtract(<span style=\"color:blue\">string</span> ZipToExtract)\r\n        {\r\n            <span style=\"color:blue\">object</span>[] args = <span style=\"color:blue\">new</span> <span style=\"color:blue\">object</span>[3];\r\n            args[0] = ZipToExtract;\r\n            args[1] = ExtractPath;\r\n            _zipBGWorker = <span style=\"color:blue\">new</span> BackgroundWorker();\r\n            _zipBGWorker.WorkerSupportsCancellation = <span style=\"color:blue\">true</span>;\r\n            _zipBGWorker.WorkerReportsProgress = <span style=\"color:blue\">false</span>;\r\n            _zipBGWorker.DoWork &#43;= <span style=\"color:blue\">new</span> DoWorkEventHandler(_zipBGWorker_DoWork);\r\n            _zipBGWorker.RunWorkerCompleted &#43;= <span style=\"color:blue\">new</span> RunWorkerCompletedEventHandler(_zipBGWorker_RunWorkerCompleted);\r\n            _zipBGWorker.RunWorkerAsync(args);\r\n            <span style=\"color:blue\">this</span>.Cursor = Cursors.WaitCursor;\r\n        }\r\n\r\n        <span style=\"color:blue\">void</span> _zipBGWorker_RunWorkerCompleted(<span style=\"color:blue\">object</span> sender, RunWorkerCompletedEventArgs e)\r\n        {\r\n            <span style=\"color:blue\">this</span>.Close();\r\n        }\r\n\r\n        <span style=\"color:blue\">private</span> <span style=\"color:blue\">void</span> _zipBGWorker_DoWork(<span style=\"color:blue\">object</span> sender, DoWorkEventArgs e)\r\n        {\r\n            <span style=\"color:blue\">object</span>[] args = (<span style=\"color:blue\">object</span>[])e.Argument;\r\n            <span style=\"color:blue\">var</span> list = args.Cast&lt;<span style=\"color:blue\">string</span>&gt;().ToList();\r\n            <span style=\"color:blue\">string</span> ZipToUnpack = list[0];\r\n            <span style=\"color:blue\">string</span> extractDir = list[1];\r\n\r\n            <span style=\"color:blue\">try</span>\r\n            {\r\n                <span style=\"color:blue\">using</span> (ZipFile zip = ZipFile.Read(ZipToUnpack))\r\n                {\r\n                    SetProgressBarMax(zip.Entries.Count);\r\n                    zip.ExtractProgress &#43;= <span style=\"color:blue\">new</span> EventHandler&lt;ExtractProgressEventArgs&gt;(zip_ExtractProgress);\r\n                    zip.ExtractAll(extractDir, ExtractExistingFileAction.OverwriteSilently);\r\n                }\r\n            }\r\n            <span style=\"color:blue\">catch</span> (Exception ex)\r\n            {\r\n                MessageBox.Show(<span style=\"color:blue\">string</span>.Format(<span style=\"color:#a31515\">&quot;There's been a problem extracting that zip file.  {0}&quot;</span>, ex.Message), \r\n                       <span style=\"color:#a31515\">&quot;Error Extracting&quot;</span>, MessageBoxButtons.OK, MessageBoxIcon.Exclamation, MessageBoxDefaultButton.Button1);\r\n            }\r\n        }\r\n\r\n        <span style=\"color:blue\">void</span> zip_ExtractProgress(<span style=\"color:blue\">object</span> sender, ExtractProgressEventArgs e)\r\n        {\r\n            <span style=\"color:blue\">if</span> (e.EventType == ZipProgressEventType.Extracting_EntryBytesWritten)\r\n            {\r\n                StepEntryProgress(e);\r\n            }\r\n        }\r\n\r\n        <span style=\"color:blue\">private</span> <span style=\"color:blue\">void</span> SetProgressBarMax(<span style=\"color:blue\">int</span> n)\r\n        {\r\n            <span style=\"color:blue\">if</span> (progressBar1.InvokeRequired)\r\n            {\r\n                progressBar1.Invoke(<span style=\"color:blue\">new</span> Action&lt;<span style=\"color:blue\">int</span>&gt;(SetProgressBarMax), <span style=\"color:blue\">new</span> <span style=\"color:blue\">object</span>[] { n });\r\n            }\r\n            <span style=\"color:blue\">else</span>\r\n            {\r\n                progressBar1.Maximum = n;\r\n                progressBar1.Step = 1;\r\n            }\r\n        }\r\n\r\n        <span style=\"color:blue\">private</span> <span style=\"color:blue\">void</span> StepEntryProgress(ExtractProgressEventArgs e)\r\n        {\r\n\r\n            <span style=\"color:blue\">if</span> (progressBar1.InvokeRequired)\r\n            {\r\n                progressBar1.Invoke(<span style=\"color:blue\">new</span> ExtractEntryProgressEventHandler(<span style=\"color:blue\">this</span>.StepEntryProgress), <span style=\"color:blue\">new</span> <span style=\"color:blue\">object</span>[] { e });\r\n            }\r\n            <span style=\"color:blue\">else</span>\r\n            {\r\n                progressBar1.Maximum = 100;\r\n                progressBar1.Value = Convert.ToInt32(100 * e.BytesTransferred / e.TotalBytesToTransfer);\r\n            }\r\n        }\r\n\r\n        <span style=\"color:blue\">private</span> <span style=\"color:blue\">void</span> Form1_FormClosing(<span style=\"color:blue\">object</span> sender, FormClosingEventArgs e)\r\n        {\r\n            <span style=\"color:blue\">if</span> (e.CloseReason == CloseReason.UserClosing &amp;&amp; AllowClose)\r\n            {\r\n                e.Cancel = <span style=\"color:blue\">true</span>;\r\n            }\r\n        }\r\n\r\n        <span style=\"color:blue\">public</span> <span style=\"color:blue\">void</span> ForceClose()\r\n        {\r\n            AllowClose = <span style=\"color:blue\">true</span>;\r\n            <span style=\"color:blue\">this</span>.Close();\r\n            AllowClose = <span style=\"color:blue\">false</span>;\r\n        }\r\n\r\n     }\r\n}\r\n</pre>\r\n</div>\r\n",
    "PostedDate": "2010-10-26T11:24:03.187-07:00",
    "UserRole": null,
    "MarkedAsAnswerDate": null
  },
  {
    "Id": "513085",
    "ThreadId": "231663",
    "Html": "\r\n<p>It looks about right to me.</p>\r\n<p>There are lots of extra pushups required if you want to do asynch work in a Winforms app.</p>\r\n<p>&nbsp;</p>\r\n",
    "PostedDate": "2010-10-26T18:23:03.767-07:00",
    "UserRole": null,
    "MarkedAsAnswerDate": null
  },
  {
    "Id": "635064",
    "ThreadId": "231663",
    "Html": "<p>Hello Cheeso,</p>\r\n<p>Guess a little late on this post :)</p>\r\n<p>Is there a way show extract&nbsp;progress in webforms ?</p>\r\n<p>Thanks.</p>",
    "PostedDate": "2011-06-29T15:08:57.3-07:00",
    "UserRole": null,
    "MarkedAsAnswerDate": null
  },
  {
    "Id": "637240",
    "ThreadId": "231663",
    "Html": "<p>Extract progress in webforms - meaning extract on a server and update the browser when the server-side extract is done?</p>\n<p>The way I would do it is to poll from browser to server periodically;&nbsp; The server needs to update a server-wide variable \"PercentExtracted\" or something like that.&nbsp; The polling request would then retrieve that number, something between 0 and 100, and display a jQuery progressbar of the appropriate length .This would work only with a long-running extraction, something where the extract would take much much longer than 5 or 6 HTTP requests.&nbsp; So... like a minute or more.&nbsp;</p>\n<p>If the extraction on the server side takes less than a minute, which will be the case for most zipfiles less than 100mb, then a simple spinning \"wait\" cursor should be sufficient.&nbsp; That's my opinion. I'm not a web UI expert, but I do&nbsp;think it's possible to over-engineer things.</p>\n<p>And yes, resurrecting a very old post to ask a completely unrelated question is bad manners. Don't do that.&nbsp; open a&nbsp;new thread.</p>",
    "PostedDate": "2011-07-04T18:52:16.043-07:00",
    "UserRole": null,
    "MarkedAsAnswerDate": null
  },
  {
    "Id": "695414",
    "ThreadId": "231663",
    "Html": "<p><a class=\"UserProfileLink\" href=\"http://www.codeplex.com/site/users/view/JDM6763\">JDM6763</a>&nbsp;example&nbsp;makes my progress bar jump back and forth when I extract the files, anyone know why? (any help or tip is&nbsp;appricieated)</p>",
    "PostedDate": "2011-11-08T09:53:13.117-08:00",
    "UserRole": null,
    "MarkedAsAnswerDate": null
  }
]