如何使用 C# 压缩单个文件?

咨询区

  • user3362735

我的项目有一个需求,需要对 文件夹 下的文件进行压缩,我用 ZipFile.CreateFromDirectory 方法发现并不能成功,但我对整个文件夹压缩是没有问题的,请问我该如何正确实现?

回答区

  • John Koerner

可以借助 file 或者 memorystream 再通过 CreateEntryFromFile() 创建一个存档文件。

  1. filestream

如果你有权限创建一个 zip 文件,那么可以使用 filestream,参考如下代码:

using (FileStream fs = new FileStream(@"C:\Temp\output.zip",FileMode.Create))
using (ZipArchive arch = new ZipArchive(fs, ZipArchiveMode.Create))
{arch.CreateEntryFromFile(@"C:\Temp\data.xml", "data.xml");
}
  1. memorystream

如果你不想保存任何磁盘痕迹,可以在内存中做任何事情,参考如下代码:

using (MemoryStream ms = new MemoryStream())
using (ZipArchive arch = new ZipArchive(ms, ZipArchiveMode.Create))
{arch.CreateEntryFromFile(@"C:\Temp\data.xml", "data.xml");
}

最后你可以将 MemoryStream 写入到 File

using (FileStream file = new FileStream("file.bin", FileMode.Create, System.IO.FileAccess.Write)) {byte[] bytes = new byte[ms.Length];ms.Read(bytes, 0, (int)ms.Length);file.Write(bytes, 0, bytes.Length);ms.Close();
}
  • John Koerner

其实在 .NET 中有很多种途径可以解决这种问题,你可以借助一些第三方类,比如:SharpZipLibsevenzipsharpDotNetZip

当然你用 ZipFile 也是可以解决的,下面是使用 FileStream 的方式。

using (var zip = ZipFile.Open("file.zip", ZipArchiveMode.Create))
{var entry = zip.CreateEntry("file.txt");entry.LastWriteTime = DateTimeOffset.Now;using (var stream= File.OpenRead(@"c:\path\to\file.txt"))using (var entryStream = entry.Open())stream.CopyTo(entryStream);
}

也可以用更简短的写法。

// reference System.IO.Compression
using (var zip = ZipFile.Open("file.zip", ZipArchiveMode.Create))zip.CreateEntryFromFile("file.txt", "file.txt");
  • AlexanderBrevig

既然压缩整个文件夹是可以的,那可以通过创建一个临时文件夹解决,然后借助临时文件夹进行压缩。

压缩流程

  1. 创建一个临时文件夹

  2. 将文件移动到文件夹

  3. 压缩文件夹

  4. 删除文件夹

解压缩流程

  1. 解压缩zip提取文件夹

  2. 从文件夹中提取出文件

  3. 删除临时文件夹

点评区

我个人在 zip 压缩的业务时用的是 DotNetZip,非常方便,功能也非常强大,强烈推荐。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/293548.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Android之mediarecorder中的方法以及工作流程的过程

嵌套、关联的类 class MediaRecorder.AudioEncoder 定义音频编码 class MediaRecorder.AudioSource 定义声音资源 interface MediaRecorder.OnErrorListener Interface definition for a callback to be invoked when an error occurs while recording. int…

杭电Problem 1872 稳定排序

稳定排序 Time Limit: 3000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others)Total Submission(s): 5200 Accepted Submission(s): 1988Problem Description大家都知道&#xff0c;快速排序是不稳定的排序方法。如果对于数组中出现的任意a[i],a[j](i<…

AMD and CMD are dead之KMD.js依赖可视化工具发布

使用 require("MyAapp.DepTree", function (DepTree) {DepTree(({renderTo: "holder",width: "820",height: "580",data: [{ "name": "System" },{ "name": "Util" },{ "name": &q…

WPF中的触发器(Trigger)

这节来讲一下WPF中的触发器——Trigger。触发器&#xff0c;是指在既定条件或者特殊场景下被触发&#xff0c;从而去执行一个操作。在WPF中&#xff0c;触发器可以分为以下几类&#xff1a;基本触发器(Trigger)&#xff1b;事件触发器(EventTrigger)&#xff1b;数据触发器(Dat…

uCOS:时钟节拍代码追踪

uCos中的时钟节拍可以基于软中断实现或者基于时钟节拍任务&#xff08;但是这个任务要给予很高的优先级&#xff09;对于STM32&#xff08;Cortex-M3&#xff09;来说这个就是SysTick中断0x0000003C当中断发生时调用OS_CPU_SysTickHandler函数&#xff0c;这样就提供了系统的时…

数学之美番外篇:平凡而又神奇的贝叶斯方法

概率论只不过是把常识用数学公式表达了出来。 ——拉普拉斯 记得读本科的时候&#xff0c;最喜欢到城里的计算机书店里面去闲逛&#xff0c;一逛就是好几个小时&#xff1b;有一次&#xff0c;在书店看到一本书&#xff0c;名叫贝叶斯方法。当时数学系的课程还没有学到概率统计…

Android之用jadx进行反编译

利用开源项目jadx反编译Android应用 利用Github开源项目jadx可以直接对 .dex, .apk, .jar, .class 类型的文件进行直接反编译对比之前 apktool(解包apk) dex2jar(将.dex转换成.jar) jd-gui (查看.jar文件)反编译三件套, jadx的优点在于: 1. 可以一行命令直接反编译恢复出.…

linux red hat 安装svn

安装步骤如下&#xff1a;1、yum install subversion 2、输入rpm -ql subversion查看安装位置&#xff0c;如下图&#xff1a;我们知道svn在bin目录下生成了几个二进制文件。输入 svn --help可以查看svn的使用方法&#xff0c;如下图。3、创建svn版本库目录mkdir -p /var/svn/s…

RTP在。net中的使用(资料)

开源组件&#xff1a;lumisoft 网址&#xff1a;http://www.lumisoft.ee/lswww/download/downloads/Examples/ 非开源的免费组建&#xff1a;rtp.net &#xff08;微软推荐&#xff09;转载于:https://www.cnblogs.com/foreverme/p/3799129.html

如何预热Web API,减少初次执行时间

前言在上次的《差距50倍&#xff01;为什么Web API第一次执行这么慢&#xff1f;》文章中&#xff0c;我们发现了部分耗时比较大的方法&#xff1a;Microsoft.AspNetCore.Mvc.Infrastructure.ActionInvokerFactory.CreateInvoker - 30.15ms查看源代码&#xff0c;ActionInvoker…

Android之关于电话录音原理,目前的方法还是只能录MIC

对于android来讲&#xff0c;没有API直接支持对电话进行双向录音。虽然MediaRecorder里面可以设置recodeRecorder.setAudioSource(MediaRecorder.AudioSource.VOICE_CALL);来表示要对双向进行录音&#xff0c;但是这个功能实际是不可使用的&#xff0c;唯一能直接使用的还是VOI…

JavaScript图片库

将图片放到网上的方法有很多,你可以简单地把所有的图片都放到网页上。但是&#xff0c;如果你打算发布的图片过多,这个页面很快会变的过于庞大,而且加上这些图片后用户要下载的的数据量就会变得相当可观。我们必须面对这样一个现实:没有人会等待很长长时间去下载一个网页;所以利…

驰骋表单设计器 设计表单案例演示

为什么80%的码农都做不了架构师&#xff1f;>>> 我们以客户提供如下原始的word表单样本&#xff0c;使用驰骋表单设计器制作表单的过程介绍如下:工业设计和创意需求登记表原始表单图 在ccform表单设计器中&#xff0c;设计如下&#xff1a; 驰骋表单设计器&#xf…

jquery this 与javascript的this

<div class"list"><table><thead><tr><th width"110" rowspan"2">用户名id</th><th width"155" rowspan"2">用户名</th><th width"80" rowspan"2"…

这个避孕套让生活更和谐……

1 三连暴击▼2 开塞露还能这样用&#xff1f;▼3 这真不是打架&#xff1f;▼4 送礼佳品&#xff0c;必拉黑神器&#xff01;▼5 孩子&#xff1a;爹妈&#xff0c;真的可以再考虑一下的......▼6 四只手才能拆的避孕套▼7 谭警官&#xff1a;莫挨我&#xff01;&#xff…

WPF GridControl控件的用法举例

01—前言WPF中自带的表格控件是DataGrid&#xff0c;但是格式并不是很美观&#xff0c;我们一般用Dev中类似的控件GridControl来取代&#xff0c;这个控件功能相当强大。WPF数据网格&#xff08;GridControl&#xff09;是一个数据感知控件&#xff0c;用于以不同的布局显示和编…

Android之如何ubuntu环境下在手机里面快速找到apk的位置然后拉下来

1、在手机里面通过包名找到APK的位置 adb shell pm list packages -f | grep acr -f 是文件路径的意思acr是过滤包名的apk名字结果显示package:/data/app/com.nll.acr-1/base.apkcom.null.acr2、得到apk路径之后&#xff0c;修改名字,拉倒本地 adb pull /data/app/com.nll.acr-…

《黑书》hdu1271递推习题:整数对

我能说这道题目被黑书坑了吗&#xff1f;这是递推题&#xff1f;......好吧&#xff0c;那么我是的确没有想到这样去做的。只是想着&#xff0c;可以枚举缺少的位&#xff0c;然后用搜索去解决.......但是我仔细思考&#xff0c;觉得用搜索太麻烦了&#xff0c;要处理很多细节&…