разархивировать а там проблемы с доступом к файлам или чем-то. А если вручную архивировать winrar то код работает. Из-за каких свойств архива могут такие проблемы возникать? Нужно что где-то разрешить? Или из-за чего может быть такое с архивами?
Если вы объясните, при чем тут с++, то, возможно, вас помогут
Покажи код
Код создания архива или разархивирование?
В котором проблема)
Вот добавление файла в архив. Мне кажется я пропустил какое-то свойство которое не дает нормально разархивировать. void MainWindow::addFileToArchive(zipFile& archive, std::string path, std::string archSubFolder) { QFileInfo fileInfo(QString::fromStdString(path)); std::string str_path = (fileInfo.absolutePath()).toStdString(); std::string search_str = archSubFolder; std::size_t pos = str_path.find(search_str); std::string archPath = ""; if (pos != std::string::npos) { archPath = str_path.substr(pos); } const char* file_path = path.c_str(); const char* file_name = ((fileInfo.fileName()).toStdString()).c_str(); std::ifstream file(file_path, std::ios::binary); if (!file) { std::cerr << "Can't open archive " << file_path << " to read." << std::endl; return; } file.seekg(0, std::ios::end); const std::streampos file_size = file.tellg(); file.seekg(0, std::ios::beg); char* buffer = new char[file_size]; file.read(buffer, file_size); std::string copy_path = path; std::size_t pos2 = copy_path.find_last_of("/\\"); std::string filename = copy_path.substr(pos2 + 1); std::size_t dot_pos = filename.find_last_of("."); std::string name_without_extension = filename.substr(0, dot_pos); string archPathRes = archPath + "/" + transliterate(name_without_extension) + "." + (fileInfo.suffix()).toStdString(); zipOpenNewFileInZip(archive, archPathRes.c_str(), nullptr, nullptr, 0, nullptr, 0, nullptr, Z_DEFLATED, Z_DEFAULT_COMPRESSION); zipWriteInFileInZip(archive, buffer, static_cast<unsigned int>(file_size)); zipCloseFileInZip(archive); delete[] buffer; }
Скорее всего архив создается не в том месте в файловой системе. Что-то с путем, отладчиком или логами глянуть, че за путь получается. Ещё надо понимать, где процесс находится, если путь относительный, потому что если относительный, то архив создается/читается относительно текущего пути процесса
const char* file_name инициализируется строкой, разрушающейся в той же строке
а че не std::filesystem::path
Обсуждают сегодня