[
  {
    "Id": "276789",
    "ThreadId": "80710",
    "Html": "<div id=\"ctl00_ctl00_MasterContent_Content_PostRepeater_ctl00_BodyDiv\">\r\n<p>Hello, I am new to C# and ASP.net...I have tried different ways to add  multiple files to one .zip file that were selected from a GridView with no  results.&nbsp; This is a logo repository where the end user selects logos by clicking  checkboxes.&nbsp; A style guide is included with each zip file for guidelines on the  use of the logo.&nbsp;&nbsp;&nbsp; I click multiple boxes and it only zips the first checkbox  that is selected.&nbsp; Here is the original code:</p>\r\n<p>protected void btnZip_Click(object sender, EventArgs e)<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;  {<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; System.Text.StringBuilder sb = new  System.Text.StringBuilder();<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; string fileName =  String.Empty;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; string ZipFileName = Server.MapPath(@&quot;TempFiles/&quot; +  Guid.NewGuid().ToString() + &quot;.zip&quot;);<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; string local_path =  tvDirTree.SelectedNode.Value.ToString();<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; local_path = &quot;.&quot; +  local_path.Substring(local_path.IndexOf(&quot;file_repository&quot;) - 1,  (local_path.Length - local_path.IndexOf(&quot;file_repository&quot;)) + 1).Replace(&quot;\\\\&quot;,  &quot;/&quot;);<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;// Iterate through the Products.Rows  property<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; foreach (GridViewRow row in dgFiles.Rows)<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;  {<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; // Access the CheckBox<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; CheckBox cb =  (CheckBox)row.FindControl(&quot;chkSelect&quot;);<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; if (cb != null  &amp;&amp; cb.Checked)<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; {<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; fileName =  (row.FindControl(&quot;lblFileName&quot;) as Label).Text;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;  <br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Response.Clear();<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;  Response.BufferOutput = false;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; string archiveName =  String.Format(&quot;archive-{0}.zip&quot;,  DateTime.Now.ToString(&quot;yyyy-MMM-dd-HHmmss&quot;));<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;  <br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; using (ZipFile zip = new  ZipFile())<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; {<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; //  filesToInclude is a IEnumerable (String[] or List  etc)<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; zip.AddFile(Server.MapPath(local_path + &quot;//&quot;  + fileName), &quot;&quot;);<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;  zip.AddFile(Server.MapPath(local_path + &quot;//&quot; + &quot;styleguide.docx&quot;),  &quot;&quot;);<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;  zip.Save(ZipFileName);<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }</p>\r\n<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; // Response.End();</p>\r\n<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Response.ContentType =  &quot;application/zip&quot;;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;  Response.AppendHeader(&quot;Content-Disposition&quot;, &quot;attachment; filename=&quot; +  archiveName);<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Response.WriteFile(ZipFileName);</p>\r\n<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Response.Flush();<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;  Response.Close();</p>\r\n<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; // delete the temp file <br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; if  (File.Exists(ZipFileName))<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;  File.Delete(ZipFileName);</p>\r\n<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;  HttpContext.Current.ApplicationInstance.CompleteRequest();</p>\r\n<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; sb.Append(String.Format(&quot;Folder {0} Zipped successfuly to  File {1}.&lt;br/&gt;&quot;, local_path, ZipFileName));</p>\r\n<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }</p>\r\n<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; lbReport.Text = sb.ToString();<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;  }<br>&nbsp;&nbsp;&nbsp; }</p>\r\n<p>Any suggestions?&nbsp; Any help is greatly appreciated!!</p>\r\n</div>",
    "PostedDate": "2010-01-13T10:56:58.047-08:00",
    "UserRole": null,
    "MarkedAsAnswerDate": null
  },
  {
    "Id": "276805",
    "ThreadId": "80710",
    "Html": "<p>Yes, there's a basic error in logic flow.</p>\r\n<p>You have a loop that begins <strong>foreach (GridViewRow row in dgFiles.Rows)...</strong>&nbsp;&nbsp; Within that loop, you create a zip file, add a couple of files to it, save it, and write it out the the Response stream.&nbsp; Then you close the response stream.&nbsp; What gets sent is a zip file with exactly 2 files in it.&nbsp;&nbsp;&nbsp;Once the Response stream is closed, you cannot re-open it.&nbsp; Therefore, the next loop through the foreach, you are doing nothing.&nbsp;</p>\r\n<p>If I understand what you're shooting for, I think what you want is the ZipFile.Save() and Response.Close() to be outside the foreach loop.</p>\r\n<div style=\"color:Black;background-color:White\">\r\n<pre><span style=\"color:Blue\">protected</span> <span style=\"color:Blue\">void</span> btnZip_Click(<span style=\"color:Blue\">object</span> sender, EventArgs e)\r\n{\r\n    System.Text.StringBuilder sb = <span style=\"color:Blue\">new</span> System.Text.StringBuilder();\r\n    <span style=\"color:Blue\">string</span> fileName = String.Empty;\r\n    <span style=\"color:Blue\">string</span> ZipFileName = Server.MapPath(Path.Combine(<span style=\"color:#A31515\">&quot;TempFiles&quot;</span>,Guid.NewGuid().ToString() + <span style=\"color:#A31515\">&quot;.zip&quot;</span>));\r\n    <span style=\"color:Blue\">string</span> local_path = tvDirTree.SelectedNode.Value.ToString();\r\n\r\n    <span style=\"color:Green\">// what does this do?  </span>\r\n    local_path = <span style=\"color:#A31515\">&quot;.&quot;</span> + local_path.Substring(local_path.IndexOf(<span style=\"color:#A31515\">&quot;file_repository&quot;</span>) - 1, \r\n        (local_path.Length - local_path.IndexOf(<span style=\"color:#A31515\">&quot;file_repository&quot;</span>)) + 1).Replace(<span style=\"color:#A31515\">&quot;\\\\&quot;, &quot;</span>/&quot;);\r\n            \r\n    <span style=\"color:Blue\">using</span> (ZipFile zip = <span style=\"color:Blue\">new</span> ZipFile())\r\n    {\r\n        <span style=\"color:Green\">// Iterate through the Products.Rows property</span>\r\n        <span style=\"color:Blue\">foreach</span> (GridViewRow row <span style=\"color:Blue\">in</span> dgFiles.Rows)\r\n        {\r\n            <span style=\"color:Green\">// Access the CheckBox</span>\r\n            CheckBox cb = (CheckBox)row.FindControl(<span style=\"color:#A31515\">&quot;chkSelect&quot;</span>);\r\n            <span style=\"color:Blue\">if</span> (cb != <span style=\"color:Blue\">null</span> &amp;&amp; cb.Checked)\r\n            {\r\n                fileName = (row.FindControl(<span style=\"color:#A31515\">&quot;lblFileName&quot;</span>) <span style=\"color:Blue\">as</span> Label).Text;\r\n                zip.AddFile(Server.MapPath(Path.Combine(local_path,fileName)), <span style=\"color:#A31515\">&quot;&quot;</span>);\r\n                zip.AddFile(Server.MapPath(Path.Combine(local_path,<span style=\"color:#A31515\">&quot;styleguide.docx&quot;</span>)), <span style=\"color:#A31515\">&quot;&quot;</span>);\r\n            }\r\n        }                    \r\n\r\n        zip.Save(ZipFileName);\r\n    }\r\n    \r\n    Response.Clear();\r\n    Response.BufferOutput = <span style=\"color:Blue\">false</span>;\r\n    Response.ContentType = <span style=\"color:#A31515\">&quot;application/zip&quot;</span>;\r\n    <span style=\"color:Blue\">string</span> archiveName = String.Format(<span style=\"color:#A31515\">&quot;archive-{0}.zip&quot;</span>, DateTime.Now.ToString(<span style=\"color:#A31515\">&quot;yyyy-MMM-dd-HHmmss&quot;</span>));\r\n    Response.AppendHeader(<span style=\"color:#A31515\">&quot;Content-Disposition&quot;</span>, <span style=\"color:#A31515\">&quot;attachment; filename=&quot;</span> + archiveName);\r\n    Response.WriteFile(ZipFileName);\r\n    Response.Flush();\r\n    Response.Close();\r\n\r\n    <span style=\"color:Green\">// delete the temp file </span>\r\n    <span style=\"color:Blue\">if</span> (File.Exists(ZipFileName))\r\n        File.Delete(ZipFileName);\r\n            \r\n    sb.Append(String.Format(<span style=\"color:#A31515\">&quot;Folder {0} Zipped successfuly to File {1}.&lt;br/&gt;&quot;</span>, local_path, ZipFileName));\r\n    lbReport.Text = sb.ToString();\r\n\r\n}</pre>\r\n</div>\r\n<p>Also, you can drop HttpContext.Current.ApplicationInstance.CompleteRequest(); .&nbsp; It should be unnecessary if you've called Response.Close().</p>\r\n<p>In your code, I replaced string concatenation with calls to Path.Combine(), which is the recommended way to do things.&nbsp; (Path is in the System.IO namespace)</p>\r\n<p>Last thing - I don't know why you are doing the local_path string manipulation (See my comment in your code), and replacing backslashes with slashes. &nbsp;It seems sort of convoluted. There's probably an easier way to do whatever it is you're doing, with static methods in the Path class.&nbsp; And, in case you are doing the Replace(&quot;\\\\&quot;,&quot;/&quot;) for the benefit of DotNetZip - it's not necessary.&nbsp;</p>\r\n<p>Good luck</p>\r\n<p>&nbsp;</p>",
    "PostedDate": "2010-01-13T11:29:33.45-08:00",
    "UserRole": null,
    "MarkedAsAnswerDate": null
  },
  {
    "Id": "276839",
    "ThreadId": "80710",
    "Html": "<p>That worked great!&nbsp; Thanks Cheeso!!&nbsp; I only had to make one small change and move the zip.AddFile for the style guide outside of the loop as well, so it is only added once...when it tried to add a second time it caused an error.&nbsp; Thanks again for your help!!</p>",
    "PostedDate": "2010-01-13T12:43:57.003-08:00",
    "UserRole": null,
    "MarkedAsAnswerDate": null
  }
]