1
A
回答
2
爲什麼,下面是一個簡單的C++ 11例子,替換某個文件並添加一個新文件:
// 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;
}
相關問題
- 1. Android修改Zip文件
- 2. 修改ZIP文件中的單個文本文件,在PHP中
- 3. 修改文本文件中的數據
- 4. 用minizip刪除和修改zip文件
- 5. 修改數據庫文件
- 6. 修改ZIP檔案文本文件中的Java
- 7. 修改Android設備上的zip文件內的xml文件
- 8. 如何修改內存中的zip文件?
- 9. 閱讀zip文件中的zip文件
- 10. 修改zip文件的md5哈希值的最快方法
- 11. 修改文件屬性/元數據
- 12. 用於在適當位置修改ZIP文件的C++庫
- 13. PowerShell的 - 在ZIP壓縮文件修改項目
- 14. 使用ZipInputStream讀取和修改內部zip文件的內容
- 15. 在字典中修改複製的數據會修改原始文件
- 16. 如何修改文本數據文件中的值使用C
- 17. 修改文件中的數組值
- 18. pyspark中的數據修改
- 19. 是否有可以修復文件的Java zip庫,àla zip -FF?
- 20. 在ZIP中的多個文件zip錯誤ZIP文件系統
- 21. 修改文件中的修補程序
- 22. 如何從Linux中的文件獲取修改的數據?
- 23. 添加到Phonegap應用程序時修改了Zip文件?
- 24. 修改數據
- 25. 修改文件中的數據(字節)iOS
- 26. 我想修改xml文件中已有的數據使用PHP
- 27. 獲取git repo中文件的最後修改數據
- 28. 編寫腳本linux命令來修改文件中的數據
- 29. Zip多個數據庫PDF blob文件
- 30. 根據修改3中的URI路徑更改路由文件
這不會修改zip文件中的數據,而是會創建一個帶有不同內容的新zip文件。按照OP的要求,是否有辦法修改壓縮文件中的數據? – josch
@josch我不認爲有可能將壓縮位從一個文件複製到另一個文件而不用'libarchive'重新打包它們。你可能需要一個不太通用的,更加面向ZIP的庫。至於就地修改,我不認爲它是由ZIP格式支持的。 – ArtemGr