Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/file/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 从服务器下载zip文件并对其进行解析_C#_File_Filestream - Fatal编程技术网

C# 从服务器下载zip文件并对其进行解析

C# 从服务器下载zip文件并对其进行解析,c#,file,filestream,C#,File,Filestream,我正在尝试从服务器下载一个压缩文件,并尝试向视图显示压缩文件夹中每个文件的内容 我编写了一个单独的代码,文件放在我的笔记本电脑上,我遍历了每个文件,并显示了如下内容 static void Main(string[] args) { string filePath = "C:\\ACL Data\\New folder\\files.zip"; var zip= new ZipInputStream(File.OpenRead(filePath)); var fil

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

我编写了一个单独的代码,文件放在我的笔记本电脑上,我遍历了每个文件,并显示了如下内容

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=newfilestream(filepath,FileMode.Open,FileAccess.Read)


这要求第一个参数是zip文件的路径。因为在新的场景中,zip文件位于服务器上的远程位置。在这种情况下,参数应该是什么?

您的原始代码在以下行上打开流两次,我认为这会造成一些混乱:

var zip= new ZipInputStream(File.OpenRead(filePath));
var filestream=new FileStream(filePath,FileMode.Open,FileAccess.Read);
ZipFile
构造函数中有一个重载,它接受“任意”流,而不是一个文件流,您(毫不奇怪)只能为文件创建文件流

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

根据ZIP文件的大小,可以选择将其加载到内存中。如果需要大文件,将其写入临时文件可能会更好

这应该可以做到,不必同时使用
ZipInputStream
ZipFile
,而是通过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:从.NET4.5开始,内置了对ZIP文件的支持。查看课程。

您不能将文件下载到临时文件中,然后处理它吗?