Loading [MathJax]/jax/output/CommonHTML/config.js
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
社区首页 >问答首页 >libArchive修改.zip文件中的数据

libArchive修改.zip文件中的数据
EN

Stack Overflow用户
提问于 2013-07-25 05:11:25
回答 1查看 1.7K关注 0票数 2

我尝试修改(内存中) zip归档中的一个文件。但我不知道该怎么做

我可以将源文件读入内存,但是我不知道下一步该做什么。

你能给我举个例子吗?我是怎么做到的?

EN

回答 1

Stack Overflow用户

发布于 2013-12-24 01:39:35

为什么,下面是一个简单的C++11示例,替换某个文件并添加一个新文件:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
// g++ -std=c++11 -Wall -g -O3 -fno-inline-functions pack.cc -o pack -larchive
#include <iostream>
using std::cout; using std::cerr; using std::endl;
#include <memory>
using std::shared_ptr; using std::unique_ptr;
#include <string.h>
#include <archive.h>  // Cygwin's libarchive. http://www.libarchive.org/
#include <archive_entry.h>

int main (int argc, char** argv) {
  const char* usage = "Usage: pack $in.zip $out.zip $pathToReplace";
  const char* inFile = argc > 1 ? argv[1] : nullptr; if (!inFile) {cerr << usage << endl; return 1;}
  const char* outFile = argc > 2 ? argv[2] : nullptr; if (!outFile) {cerr << usage << endl; return 1;}
  const char* pathToReplace = argc > 3 ? argv[3] : nullptr; if (!pathToReplace) {cerr << usage << endl; return 1;}

  shared_ptr<archive> in (archive_read_new(), [inFile](archive* ar) {if (archive_read_finish (ar) != ARCHIVE_OK) cerr << "Error closing " << inFile << endl;});
  archive_read_support_format_zip (in.get());  // https://github.com/libarchive/libarchive/wiki/FormatZip
  int rc = archive_read_open_filename (in.get(), inFile, 65536);
  if (rc != ARCHIVE_OK) {cerr << "Error opening archive " << inFile << endl; return 1;}

  shared_ptr<archive> out (archive_write_new(), [outFile](archive* ar) {if (archive_write_finish (ar) != ARCHIVE_OK) cerr << "Error closing " << outFile << endl;});
  archive_write_set_format_zip (out.get());
  rc = archive_write_open_filename (out.get(), outFile);
  if (rc != ARCHIVE_OK) {cerr << "Error opening archive " << outFile << endl; return 1;}

  archive_entry* entry; while (archive_read_next_header (in.get(), &entry) == ARCHIVE_OK) {
    const char* path = archive_entry_pathname (entry);
    int64_t size = archive_entry_size (entry);
    char buf[size]; if (archive_read_data (in.get(), buf, size) != size) {cerr << "Error reading " << path << endl; return 1;}
    if (strcmp (path, pathToReplace) == 0 && size > 3) {strcpy (buf, "bar"); size = 3;}  // Replacing contents of the given file.
    rc = archive_write_header (out.get(), entry); if (rc != ARCHIVE_OK) {cerr << "Error writing " << path << endl; return 1;}
    if (archive_write_data (out.get(), buf, size) != size) {cerr << "Error writing " << path << endl; return 1;}
  }

  // Add a new file.
  unique_ptr<archive_entry, void(*)(archive_entry*)> we (archive_entry_new(), archive_entry_free);
  archive_entry_set_pathname (we.get(), "foo");
  archive_entry_set_size (we.get(), 3);
  archive_entry_set_filetype (we.get(), AE_IFREG);
  archive_entry_set_perm (we.get(), 0664);
  rc = archive_write_header (out.get(), we.get()); if (rc != ARCHIVE_OK) {cerr << "Error writing foo" << endl; return 1;}
  if (archive_write_data (out.get(), "bar", 3) != 3) {cerr << "Error writing foo" << endl; return 1;}
  return 0;
}
票数 4
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/17859036

复制
相关文章
MySQL 计算两个日期之间相差的秒数 SQL
update h5perf_task set run_state = 0 where id in (SELECT t.id from (SELECT * FROM h5perf_task WHERE run_state = 2 and UNIX_TIMESTAMP( now() )-UNIX_TIMESTAMP(begin_run_time) > 420) t);
一个会写诗的程序员
2018/08/17
3.5K0
sql server 日期转字符串_db2 日期转字符串
While working with raw data, you may frequently face date values stored as text. Converting these values to a date data type is very important since dates may be more valuable during analysis. In SQL Server, converting a string to date can be achieved in different approaches.
全栈程序员站长
2022/11/08
3.5K0
SQL---计算两个日期之间的时间差
在进行日期处理的时候,有时会需要计算一下两个日期之间相差几年零几个月,这里记录一下,如何用mysql数据库和java结合,准确的拿到两个日期之间的时间差。
IT云清
2019/01/22
7.8K0
Java获取两个日期之间的日期
/** * 获取两个日期之间的日期 * @param start 开始日期 * @param end 结束日期 * @return 日期集合 */ private List<Date> getBetweenDates(Date start, Date end) { List<Date> result = new ArrayList<Date>(); Calendar tempStart = Calendar.g
水煮麥楽雞
2022/11/20
6.1K0
php计算两个日期之间的间隔,避免导出大量数据
在做系统业务功能的时候,有的时候业务人员会进行超大范围地导出excel表格,导致内存、CPU占用飙升。
宣言言言
2019/12/17
2.4K0
日期sql
select date_add(curdate(),interval -day(curdate())+1 day) 2020-01-01 今天所在月份第一天
Centy Zhao
2020/02/11
6560
sql语句日期格式_sql日期类型怎么写
SQL Server中文版的默认的日期字段datetime格式是yyyy-mm-dd Thh:mm:ss.mmm 例如: select getdate() 2004-09-12 11:06:08.177 整理了一下SQL Server里面可能经常会用到的日期格式转换方法: 举例如下: select CONVERT(varchar, getdate(), 120 ) 2004-09-12 11:06:08
全栈程序员站长
2022/11/01
2.5K0
mysql计算日期之间相差的天数
有两种方式可以获得mysql两个日期之间的差值,一种是使用TO_DAYS函数,另一种是datediff函数
用户8983410
2021/11/01
4.3K0
golang如何计算两个日期之间的日期差?
golang如何计算两个日期之间的日期差? 日期格式:“2017-09-01” ,“2018-03-11”
双面人
2022/09/28
7.4K0
如何用Python获取两个日期之间的日期?
问:如何用Python获取两个日期之间的日期? def date_range(start, end): delta = end - start # as timedelta days = [start + timedelta(days=i) for i in range(delta.days + 1)] return days start_date = datetime(2020, 12, 1) end_date = datetime(2020, 12, 5) print(d
TalkPython
2020/12/11
5.7K0
SQL Server的日期计算
SELECT DATEADD(mm, DATEDIFF(mm,0,getdate()), 0)
用户8983410
2021/11/02
2.2K0
[php][零散代码]php日期计算
[php][零散代码]php日期计算 <?php $startData = "2020-01-1"; $stopData = "2020-01-31"; $s = new \DateTime(
landv
2020/04/25
2.7K0
SQL表之间的关系
要在表之间强制执行引用完整性,可以定义外键。修改包含外键约束的表时,将检查外键约束。
用户7741497
2022/06/06
2.5K0
使用KVM克隆用于Oracle DB的主机
首先,通过现有的vm1「在上篇文章 使用KVM创建OEL虚拟机 已创建」克隆出一个vm,名字叫做db1,然后修改一些配置,使其更适用于Oracle DB的主机。
Alfred Zhao
2023/01/08
7400
Sql常用日期格式
SQL Server中文版的默认的日期字段datetime格式是yyyy-mm-dd Thh:mm:ss.mmm  例如:  select getdate()  2004-09-12 11:06:08.177  整理了一下SQL Server里面可能经常会用到的日期格式转换方法:  举例如下:  select CONVERT(varchar, getdate(), 120 )  2004-09-12 11:06:08
javascript.shop
2019/09/04
2.1K0
用于查询的日期类型转换帮助类
本文转载:http://www.cnblogs.com/iamlilinfeng/p/3378659.html
跟着阿笨一起玩NET
2018/09/19
7650
用于查询的日期类型转换帮助类
sql 日期格式汇总
SQLserver中用convert函数转换日期格式2008-01-15 15:51SQLserver中用convert函数转换日期格式 SQL Server中文版的默认的日期字段datetime格式是yyyy-mm-dd Thh:mm:ss.mmm 例如: select getdate() 2004-09-12 11:06:08.177 整理了一下SQL Server里面可能经常会用到的日期格式转换方法: 举例如下: select CONVERT(varchar, getdate(), 120 ) 200
用户1217611
2018/01/30
2.2K0
SQL基础日期函数
1 --dateadd 将制定的数值添加到指定的日期部分后的日期 select dateadd(mm,4,'01/01/99') 2 -- 返回:以当前的日期格式返回05/01/99 3 4 --datediff 二个日期之间的指定日期部分的区别 select datediff(mm,'01/01/99','05/01/99') 5 --返回:4 6 7 --datename 日期中指定日期部分的字符串形式 select datename(dw,'01/01/2000')
用户1112962
2018/07/04
2.1K0
SQL 获取最长的日期序列
有一张学习打卡表 his_sign 表,简单起见,只设置了两个字段(id,create_ts),一个是主键,另一个是打卡时间。his_sign 表的数据如下,我们要统计出这张表里面最长的连续打卡记录。
白日梦想家
2020/07/20
2.5K0
sql 日期格式汇总
SQLserver中用convert函数转换日期格式2008-01-15 15:51SQLserver中用convert函数转换日期格式
全栈程序员站长
2022/07/11
2.1K0

相似问题

如何让Traefik信任我们公司的CA来生成letsencrypt证书?

179

使用受信任的CA创建SSL证书

23

购买CA证书后,我是否也会信任其他公司从该CA证书生成的服务证书?

25

在istio级别上信任CA证书

10

Ngnix SSL信任库/ca证书规范

11
添加站长 进交流群

领取专属 10元无门槛券

AI混元助手 在线答疑

扫码加入开发者社群
关注 腾讯云开发者公众号

洞察 腾讯核心技术

剖析业界实践案例

扫码关注腾讯云开发者公众号
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档
查看详情【社区公告】 技术创作特训营有奖征文