Question

Using this I have written code to first created a zip folder and then download the zip file when user clicks on download all button. It is working fine. But when user extracts that zip file H:/abd/zyc/questionpapers/papername/questionpaper.pdf (absolute path). But what i want is when user extracts the zip file user must get only papername folder not other folders. Please help me how to solve this.

Here is my code.

protected void Page_Load(object sender, EventArgs e)
{
    StartZip(Request.QueryString["path"].ToString(), Request.QueryString["fname"].ToString());
    fileDownload(Request.QueryString["fname"].ToString(), Server.MapPath(Request.QueryString["fname"].ToString()));
}


public void StartZip(string directory, string zipfile_path)
    {
        // the directory you need to zip 
        string[] filenames = Directory.GetFiles(directory);
        // path which the zip file built in 
        ZipOutputStream s = new ZipOutputStream(File.Create(zipfile_path));

        foreach (string filename in filenames)
        {
            FileStream fs = File.OpenRead(filename);
            byte[] buffer = new byte[fs.Length];

            fs.Read(buffer, 0, buffer.Length);
            ZipEntry entry = new ZipEntry(filename);
            s.PutNextEntry(entry);
            s.Write(buffer, 0, buffer.Length);
            fs.Close();


        }
        s.SetLevel(5);
        s.Finish();
        s.Close();
    }
    private void fileDownload(string fileName, string fileUrl)
    {
        Page.Response.Clear();
        bool success = ResponseFile(Page.Request, Page.Response, fileName, fileUrl, 1024000);
        if (!success)
            Response.Write("Downloading Error!");
        Page.Response.End();

    }
    public static bool ResponseFile(HttpRequest _Request, HttpResponse _Response, string _fileName, string _fullPath, long _speed)
    {
        try
        {
            FileStream myFile = new FileStream(_fullPath, FileMode.Open, FileAccess.Read, FileShare.ReadWrite);
            BinaryReader br = new BinaryReader(myFile);
            try
            {
                _Response.AddHeader("Accept-Ranges", "bytes");
                _Response.Buffer = false;
                long fileLength = myFile.Length;
                long startBytes = 0;

                int pack = 10240; //10K bytes
                int sleep = (int)Math.Floor((double)(1000 * pack / _speed)) + 1;
                if (_Request.Headers["Range"] != null)
                {
                    _Response.StatusCode = 206;
                    string[] range = _Request.Headers["Range"].Split(new char[] { '=', '-' });
                    startBytes = Convert.ToInt64(range[1]);
                }
                _Response.AddHeader("Content-Length", (fileLength - startBytes).ToString());
                if (startBytes != 0)
                {
                    _Response.AddHeader("Content-Range", string.Format(" bytes {0}-{1}/{2}", startBytes, fileLength - 1, fileLength));
                }
                _Response.AddHeader("Connection", "Keep-Alive");
                _Response.ContentType = "application/octet-stream";
                _Response.AddHeader("Content-Disposition", "attachment;filename=" + HttpUtility.UrlEncode(_fileName, System.Text.Encoding.UTF8));

                br.BaseStream.Seek(startBytes, SeekOrigin.Begin);
                int maxCount = (int)Math.Floor((double)((fileLength - startBytes) / pack)) + 1;

                for (int i = 0; i < maxCount; i++)
                {
                    if (_Response.IsClientConnected)
                    {
                        _Response.BinaryWrite(br.ReadBytes(pack));
                        Thread.Sleep(sleep);
                    }
                    else
                    {
                        i = maxCount;
                    }
                }
            }
            catch
            {
                return false;
            }
            finally
            {
                br.Close();
                myFile.Close();
            }
        }
        catch
        {
            return false;
        }
        return true;
    }
Was it helpful?

Solution

This should work...

ZipEntry entry = new ZipEntry(Path.GetFileName(filename)); // just the file name
Licensed under: CC-BY-SA with attribution
Not affiliated with StackOverflow
scroll top