从服务器下载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
构造函数有一个重载,它采用 "any" 流而不是特定的 FileStream,您 - 不出所料 - 只能为文件创建。
但是不能直接使用GetResponseStream
返回的流,因为CanSeek
属性是false
。这是因为它是一个 NetworkStream,从头到尾只能读取一次。 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:从 .NET 4.5 开始,内置了对 ZIP 文件的支持。请参阅 ZipArchive class。
我正在尝试从服务器下载一个压缩文件,并试图在视图中显示压缩文件夹中每个文件的内容。
我写了一个单独的代码,文件在我的笔记本电脑上,我 运行 遍历每个文件并显示了
等内容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
构造函数有一个重载,它采用 "any" 流而不是特定的 FileStream,您 - 不出所料 - 只能为文件创建。
但是不能直接使用GetResponseStream
返回的流,因为CanSeek
属性是false
。这是因为它是一个 NetworkStream,从头到尾只能读取一次。 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:从 .NET 4.5 开始,内置了对 ZIP 文件的支持。请参阅 ZipArchive class。