繁体   English   中英

从服务器下载zip文件并解析它

[英]Download zip file from the server and parsing it

我试图从服务器下载一个压缩文件,并尝试将压缩文件夹中的每个文件的内容显示到视图中。

我写了一个单独的代码,其中文件在我的笔记本电脑上,我跑过每个文件,并删除了诸如的内容

static void Main(string[] args)
{
     string filePath = "C:\\ACL Data\\New folder\\files.zip";
     var zip= new ZipInputStream(File.OpenRead(filePath));
     var filestream=new FileStream(filePath,FileMode.Open,FileAccess.Read);
     ZipFile zipfile = new ZipFile(filestream);
     ZipEntry item;
     while ((item = zip.GetNextEntry()) != null)
     {
         Console.WriteLine(item.Name);
         using (StreamReader s = new StreamReader(zipfile.GetInputStream(item)))
         {
             Console.WriteLine(s.ReadToEnd());
         }
     }
     Console.Read();
 }

我正在使用sharplibzip库来实现这一点当zip文件位于系统本地时就是这种情况。 我的下一个任务场景是如果压缩文件位于服务器上。 我正在找出实现它的方法,下面是我认为应该工作的代码

static void Main(string[] args)
{
    string url = "https://test/code/304fd9c6-7e53-42a2-845a-624608bfd2ce.zip";
    WebRequest webRequest = WebRequest.Create(url);
    webRequest.Method = "GET";
    WebResponse webResponse = webRequest.GetResponse();
    var zip = new ZipInputStream(webResponse.GetResponseStream());
    ZipEntry item1;

    //var zip= new ZipInputStream(File.OpenRead(filePath));
    var filestream = new FileStream(filepath, FileMode.Open, FileAccess.Read);
    ZipFile zipfile = new ZipFile(filestream);
    ZipEntry item;
    while ((item = zip.GetNextEntry()) != null)
    {
        Console.WriteLine(item.Name);
        using (StreamReader s = new StreamReader(zipfile.GetInputStream(item)))
        {
            Console.WriteLine(s.ReadToEnd());
        }
    }
    Console.Read();
} 

我被困在这个部分: var filestream = new FileStream(filepath, FileMode.Open, FileAccess.Read);

这期望第一个参数是zip文件的路径。 由于在新方案中,zip文件位于服务器上的远程位置。 在这种情况下应该是什么参数?

您的原始代码会在以下行中打开两次流,我认为这会导致一些混淆:

var zip= new ZipInputStream(File.OpenRead(filePath));
var filestream=new FileStream(filePath,FileMode.Open,FileAccess.Read);

ZipFile构造函数有一个重载,它接受“任意”Stream,而不是特别是FileStream,你不出所料 - 只能为文件创建。

但是,您不能直接使用GetResponseStream返回的流,因为它的CanSeek属性为false 这是因为它是一个NetworkStream,只能从头到尾读取一次。 SharpZipLib需要随机访问才能读取文件内容。

根据ZIP文件的大小,将其加载到内存中可能是一种选择。 如果您期望大文件,将其写入临时文件可能会更好。

这应该做的伎俩,而无需同时使用ZipInputStreamZipFile ,通过使用ZipFile枚举,而不是:

string url = "https://test/code/304fd9c6-7e53-42a2-845a-624608bfd2ce.zip";
WebRequest webRequest = WebRequest.Create(url);
webRequest.Method = "GET";
WebResponse webResponse = webRequest.GetResponse();

using (var responseStream = webResponse.GetResponseStream())
using (var ms = new MemoryStream())
{
    // Copy entire file into memory. Use a file if you expect a lot of data
    responseStream.CopyTo(ms);

    var zipFile = new ZipFile(ms);

    foreach (ZipEntry item in zipFile)
    {
        Console.WriteLine(item.Name);
        using (var s = new StreamReader(zipFile.GetInputStream(item)))
        {
            Console.WriteLine(s.ReadToEnd());
        }
    }
}
Console.Read();

PS:从.NET 4.5开始,支持内置的ZIP文件。请参阅ZipArchive类。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM