0

我一直在开发这个应用程序,它使用户能够登录到另一个网站,然后从该服务器下载指定的文件。至此,我已经成功登录网站并下载了文件。但是当涉及到 zip 文件时,一切都毁了。

是否有任何代码块有助于逐字节或使用流阅读器读取 .zip 文件?

我正在使用downloadfile(),但它没有返回正确的 zip 文件。

我需要一种可以读取 zip 文件的方法。我可以通过使用来做到这一点ByteReader()

用于下载 zip 文件的代码是

string filename = "13572_BranchInformationReport_2012-05-22.zip";
            string filepath = "C:\\Documents and Settings\\user\\Desktop\\" + filename.ToString();
            WebClient client = new WebClient();
            string user = "abcd", pass = "password";
            client.Credentials = new NetworkCredential(user, pass);
            client.Encoding = System.Text.Encoding.UTF8;
            try
            {
                client.DownloadFile("https://web.site/archive/13572_BranchInformationReport_2012-05-22.zip", filepath);
                Response.Write("Success");
            }
            catch (Exception ue)
            {
                Response.Write(ue.Message);
            }

提前致谢。

4

3 回答 3

4

是否有任何代码块有助于使用流阅读器逐字节读取 zip 文件。

绝对不。StreamReader- 实际上 anyTextReader用于阅读文本内容,而不是二进制内容。zip 文件不是文本 - 它由字节组成,而不是字符。

如果您正在阅读诸如 zip 文件之类的二进制内容,则应该使用 aStream而不是TextReader任何类型的 a。

请注意,WebClient.DownloadFileWebClient.DownloadData通常可以使下载二进制内容更容易。

于 2012-06-26T09:40:10.410 回答
0

另一种下载 zip 文件的简单方法

 <asp:HyperLink ID="HyperLink1" runat="server" NavigateUrl="~/DOWNLOAD/Filename.zip">Click To Download</asp:HyperLink>

另一种解决方案

 private void DownloadFile()
    {


        string getPath = "DOWNLOAD/FileName.zip";
        System.IO.Stream iStream = null;

        byte[] buffer = new Byte[1024];

        // Length of the file:
        int length;

        // Total bytes to read:
        long dataToRead;

        // Identify the file to download including its path.
        string filepath = Server.MapPath(getPath);

        // Identify the file name.
        string filename = System.IO.Path.GetFileName(filepath);
        try
        {
            // Open the file.
            iStream = new System.IO.FileStream(filepath, System.IO.FileMode.Open,
                        System.IO.FileAccess.Read, System.IO.FileShare.Read);


            // Total bytes to read:
            dataToRead = iStream.Length;
            // Page.Response.ContentType = "application/vnd.android.package-archive";
            //   Page.Response.ContentType = "application/octet-stream";
            Page.Response.AddHeader("Content-Disposition", "attachment; filename=" + filename);

            // Read the bytes.
            while (dataToRead > 0)
            {
                // Verify that the client is connected.
                if (Response.IsClientConnected)
                {
                    // Read the data in buffer.
                    length = iStream.Read(buffer, 0, 1024);

                    // Write the data to the current output stream.
                    Page.Response.OutputStream.Write(buffer, 0, length);

                    // Flush the data to the HTML output.
                    Page.Response.Flush();

                    //  buffer = new Byte[1024];
                    dataToRead = dataToRead - length;
                }
                else
                {
                    //prevent infinite loop if user disconnects
                    dataToRead = -1;
                }
            }
        }
        catch (Exception ex)
        {
            // Trap the error, if any.
            Page.Response.Write(ex.Message);
        }
        finally
        {
            if (iStream != null)
            {
                //Close the file.
                iStream.Close();
                Page.Response.Close();
            }

        }
    }
于 2012-06-26T11:45:07.770 回答
0

您的答案

WebRequest objRequest = System.Net.HttpWebRequest.Create(url);
objResponse = objRequest.GetResponse();
byte[] buffer = new byte[32768];
using (Stream input = objResponse.GetResponseStream())
{
using (FileStream output = new FileStream ("test.doc",
FileMode.CreateNew))
{
int bytesRead;

while ( (bytesRead=input.Read (buffer, 0, buffer.Length)) > 0)
{
output.Write(buffer, 0, bytesRead);
}
}
} 

这就是我实现它的方式。谢谢大家的帮助

于 2012-06-27T05:29:27.303 回答