当前位置: 首页 > 知识库问答 >
问题:

不用磁盘IO直接从对象创建zip文件

韩麒
2023-03-14

注意:我更喜欢使用。NET framework库(而不是外部库)来完成此操作

共有1个答案

卢权
2023-03-14

是的,完全在内存中创建zip文件是可能的,下面是一个使用sharpzip库的示例(更新:末尾添加了使用ziparchive的示例):

public static void Main()
{
    var fileContent = Encoding.UTF8.GetBytes(
        @"{
            ""fruit"":""apple"",
            ""taste"":""yummy""
          }"
        );


    var zipStream = new MemoryStream();
    var zip = new ZipOutputStream(zipStream);

    AddEntry("file0.json", fileContent, zip); //first file
    AddEntry("file1.json", fileContent, zip); //second file (with same content)

    zip.Close();

    //only for testing to see if the zip file is valid!
    File.WriteAllBytes("test.zip", zipStream.ToArray());
}

private static void AddEntry(string fileName, byte[] fileContent, ZipOutputStream zip)
{
    var zipEntry = new ZipEntry(fileName) {DateTime = DateTime.Now, Size = fileContent.Length};
    zip.PutNextEntry(zipEntry);
    zip.Write(fileContent, 0, fileContent.Length);
    zip.CloseEntry();
}

您可以使用Nuget命令pm>Install-Package sharpzipb获取sharpzip

更新:

public static void Main()
{
    var fileContent = Encoding.UTF8.GetBytes(
        @"{
            ""fruit"":""apple"",
            ""taste"":""yummy""
          }"
        );

    var zipContent = new MemoryStream();
    var archive = new ZipArchive(zipContent, ZipArchiveMode.Create);

    AddEntry("file1.json",fileContent,archive);
    AddEntry("file2.json",fileContent,archive); //second file (same content)

    archive.Dispose();

    File.WriteAllBytes("testa.zip",zipContent.ToArray());
}


private static void AddEntry(string fileName, byte[] fileContent,ZipArchive archive)
{
    var entry = archive.CreateEntry(fileName);
    using (var stream = entry.Open())
        stream.Write(fileContent, 0, fileContent.Length);

}
 类似资料:
  • 问题内容: 我的硬盘上有两个(每个2GB)文件,想要将它们相互比较: 使用Windows资源管理器复制原始文件大约需要花费时间。2-4分钟(即在同一物理和逻辑磁盘上进行读写)。 读取两次并逐字节比较字节数组需要20多分钟。 缓冲区为64kb,将文件分块读取然后进行比较。 比较完成是一个紧密的循环 我该怎么做才能加快速度?NIO是否应该比普通流更快?Java是否无法使用DMA / SATA技术,而是

  • 可引导的软盘一般被视为是最后一种方法用于在那些不能从光盘引导安装程序的硬件上引导安装程序, 也适用于其他类似的情况。 磁盘映像是一些装有原始的软盘文件内容的文件。 磁盘映像,比如 boot.img 则不能直接拷贝到软盘中。 一个特殊的程序负责向软盘中 安装原始模式写入磁盘映像文件 raw 。这是一个必须的步骤,因为这些映像 文件是一些原始的磁盘保存方式。所以需要把文件的数据 按扇区拷贝 放到软盘

  • 问题内容: Web服务通常需要压缩几个大文件,以供客户端下载。最明显的方法是创建一个临时zip文件,然后将其发送给用户或将其保存到磁盘并重定向(在将来的某个时间将其删除)。 但是,以这种方式进行操作有缺点: 密集的CPU和磁盘抖动的初始阶段,导致… 在准备档案时,给用户带来了相当大的初始延迟 每个请求的内存占用量非常高 使用大量的临时磁盘空间 如果用户在中途取消下载,则初始阶段使用的所有资源(CP

  • 问题内容: 这是我用来创建带有密码的文件的代码 但是它设置密码而不是密码,符号将被忽略。为什么? 问题答案: ^字符是命令外壳程序中的转义字符。尝试加倍。

  • 问题内容: 我的项目中有一些模型类,例如,等等,它们具有多个字段及其setter-getter方法,我需要 通过套接字 与客户端和服务器之间 来回交换这些类的对象作为JSONObject 。 有什么方法可以直接从模型类的对象创建,以使对象的字段成为键,而该模型类对象的值成为此JSONObject的值。 例: 我创建JSON对象为: 这让我有点像: 请注意,在我的某些模型类中,某些属性本身 是其他模

  • 问题内容: 我需要从URL对象创建一个File对象我的需求是我需要创建一个网络图像的文件对象(例如googles徽标) 问题答案: 您可以利用以便从URL加载图像,然后将其写入文件。像这样: 如果需要,这还允许您将图像转换为其他格式。