使用ICSharpCode.dll解压多个压缩文件流

  最近项目中遇到一个技术难点,那就是从ftp上下载压缩的文件流,当然一个压缩文件,往往包含多个文件,那么当拿到一个压缩文件流后,该如何解压呢?

那么此时,一个插件就要派上用场了,那就是ICSharpCode.dll。可以在你的当前程序nuget 中获取这个插件,然后添加引用。

代码如下:

public static string DecompressGzStream(Stream stream)
{
ZipInputStream s = new ZipInputStream(stream);
ZipEntry theEntry;
List<LocationInfo> list = new List<LocationInfo>();
try
{
while ((theEntry = s.GetNextEntry()) != null)
{
string fileName = Path.GetFileNameWithoutExtension(theEntry.Name);
if (fileName != String.Empty)
{
MemoryStream ms = new MemoryStream();
s.CopyTo(ms);
byte[] bytes = ms.ToArray();
string str = System.Text.Encoding.Default.GetString(bytes);
AddTaxiInfor(str, list);
ms.Close();
}

}
s.Close();
}
catch (Exception ex)
{
throw new Exception(ex.Message);
}
System.Web.Script.Serialization.JavaScriptSerializer json = new System.Web.Script.Serialization.JavaScriptSerializer();
string jsonStr = json.Serialize(list);
return jsonStr;
}

 

public static void AddTaxiInfor(string str, List<LocationInfo> list)
{
double d = 0;
string[] arr = str.Split('\n');
for (int i = 0; i < arr.Length - 1; i++)
{
string sigle = arr[i];
string[] little = sigle.Split(',');
LocationInfo entity = new LocationInfo();

if (double.TryParse(little[0], out d) && double.TryParse(little[1], out d))
{
entity.Latitude = Convert.ToDouble(little[0]);
entity.Longitude = Convert.ToDouble(little[1]);
list.Add(entity);
}
}
}

 

不过这个插件也有不足的地方,那就是当循环读取每一个文件的流的时候,如果直接操作当前的文件流,会调用closed(),那么第一次是可以读取的,当第二次循环的时候,就会报空指针异常,不过,我还是用了一个办法给解决了,那就是每获取一个文件流,都重新创建一个流,然后进行复制,然后操作生成的新的流对象,那么就不会再出现这个问题了。好了,就将这么多了。希望能帮到大家。

转载于:https://www.cnblogs.com/panchangtao/articles/4376992.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值