当前位置:   article > 正文

c++调用libarchive库解压文件,

libarchive

libarchive资料好少,倒腾好久弄出来个demo,用博客记一下

解压文件名是包含在压缩包中的相对文件路径的,要先创建在系统中对于的文件夹才能解压出来。

带中文字符的文件解压不出来,暂时没去排查原因。

libarchive库我查到的信息说是支持7z,但是实际操作下来没支持,不知道是不是编译的时候没编译好

  1. #include <archive.h>
  2. #include <archive_entry.h>
  3. #include <iostream>
  4. using namespace std;
  5. #include <iostream>
  6. #include <fstream>
  7. using namespace std;
  8. void GetFileHeader()
  9. {
  10. ifstream file(R"(C:\Users\Administrator\Desktop\QtQuickApplication2\QtQuickApplication2\74.zip)");
  11. char buffer[11]; // 定义一个长度为11的字符数组,包括最后一个字符'\0'
  12. file.read(buffer, 10); // 读取文件的前10个字符
  13. buffer[10] = '\0'; // 字符数组最后一个字符赋值为'\0',表示字符串的结束
  14. cout << "前10个字符为:" << buffer << endl; // 输出所读取的字符
  15. file.close(); // 关闭文件
  16. }
  17. int example_unpress()
  18. {
  19. struct archive *a;
  20. struct archive_entry *entry;
  21. int r;
  22. const char *password = "key"; //
  23. const char *filePath = R"(C:\Users\Administrator\Desktop\QtQuickApplication2\QtQuickApplication2\74.zip)";
  24. a = archive_read_new();
  25. r = archive_read_support_format_all(a);
  26. archive_read_set_options(a, "7zip:use_cryptography_extension=1");
  27. if (r != ARCHIVE_OK) {
  28. exit(1);
  29. }
  30. const char *format = NULL;
  31. if (archive_read_add_passphrase(a, password) != ARCHIVE_OK) {
  32. auto i = archive_error_string(a);
  33. printf("Error adding passphrase: %s\n", i);
  34. return 1;
  35. }
  36. r = archive_read_open_filename(a, filePath, 500 * 1240); // test.zip
  37. if (r != ARCHIVE_OK) {
  38. auto errInfo = archive_error_string(a);
  39. cout << "Error opening compressed file." << endl;
  40. return 1;
  41. }
  42. bool is_encrypted = archive_read_has_encrypted_entries(a);
  43. int size = 1024 * 1024;
  44. char *buff = new char[size];
  45. while (1) {
  46. r = archive_read_next_header(a, &entry);
  47. if (r != ARCHIVE_OK) {
  48. auto i = archive_error_string(a);
  49. break;
  50. }
  51. format = archive_format_name(a);
  52. // 获取文件名
  53. const char *filename = archive_entry_pathname(entry); //;"tmp"
  54. if (filename == nullptr) {
  55. break;
  56. }
  57. cout << "Extracting: " << filename << endl;
  58. // 打开文件并写入解压数据
  59. FILE *file = fopen(filename, "wb");
  60. if (!file) {
  61. cout << "Error opening file." << endl;
  62. return 1;
  63. }
  64. while (1) {
  65. r = archive_read_data(a, buff, size);
  66. if (r <= 0) {
  67. auto i = archive_error_string(a);
  68. break;
  69. }
  70. fwrite(buff, size, 1, file);
  71. }
  72. fclose(file);
  73. }
  74. delete[]buff;
  75. archive_read_close(a);
  76. archive_read_free(a);
  77. return 0;
  78. }

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/笔触狂放9/article/detail/646804
推荐阅读
相关标签
  

闽ICP备14008679号