Добавить файлы в существующий zip-файл с помощью Poco :: Zip - PullRequest
1 голос
/ 16 января 2020

После успешного сжатия папки, вот моя ситуация:

Если append = true и overWrite = false Я должен проверить, существует ли целевой zip-файл или нет, если он существует, я проверю существующий zip-файл какие файлы в нем отсутствуют, и добавьте в него новый файл из исходной папки.

Мой вопрос:

  • Как мне открыть zip-файл и поместить его в сжатый файл? объект? или какую другую библиотеку в Poco я должен использовать, чтобы открыть поток zip? Я пытаюсь использовать std::ifstream, но Poco :: zip :: Compress, похоже, не получает std::ifstream

Я, конечно, должен изменить сам исходный код Poco, чтобы он соответствовал моему требование. Заранее спасибо.

 void ZipFile(string source, string target, List extensions, bool append, bool overWrite)
    {    
        Poco::File tempFile(source);
        if (tempFile.exists())
        {
            if (Poco::File(target).exists() && append && !overWrite) {

            fs::path targetPath = fs::path(target);
            std::ifstream targetFileStream(targetPath.string(), std::ios::binary);

            std::ofstream outStream(target, ios::binary);
            CompressEx compress(outStream, false, false);

            if (tempFile.isDirectory())
            {
                Poco::Path sourceDir(source);
                sourceDir.makeDirectory();
                compress.addRecursive(sourceDir, Poco::Zip::ZipCommon::CompressionMethod::CM_AUTO,
                    Poco::Zip::ZipCommon::CL_NORMAL, false);
            }
            else if (tempFile.isFile())
            {
                Poco::Path path(tempFile.path());
                compress.addFile(path, path.getFileName(), Poco::Zip::ZipCommon::CompressionMethod::CM_AUTO,
                    Poco::Zip::ZipCommon::CL_NORMAL);
            }

            compress.close(); // MUST be done to finalize the Zip file
            outStream.close();
        }
}

1 Ответ

2 голосов
/ 24 января 2020

Нет необходимости изменять исходный код Poco. Poco позволяет получать содержимое архива и добавлять файлы в него .

Сначала откройте целевой архив, чтобы проверить, какие файлы уже там находятся:

Poco::ZipArchive archive(targetFileStream);

Затем соберите все файлы, которые вы хотите добавить, но которые еще не находятся в архиве:

std::vector<fs::path> files;
if (fs::is_directory(source)) {
    for(auto &entry : fs::recursive_directory_iterator())
        // if entry is file and not in zip
        if (fs::is_regular_file(entry)
            && archive.findHeader(fs::relative(entry.path, source)) == archive.headerEnd()) {
            files.push_back(entry.path);
        }
} else if (fs::is_regular_file(entry)
           && archive.findHeader(source) == archive.headerEnd()) {
    files.push_back(source);
}

Наконец, добавьте файлы в свой zip

Poco::Zip::ZipManipulator manipulator(target, false);
for(auto &file : files)
    manipulator.addFile(fs::relative(file, source), file,
                        Poco::Zip::ZipCommon::CompressionMethod::CM_AUTO,
                        Poco::Zip::ZipCommon::CL_NORMAL);

У меня не было возможности проверить это. Так что попробуйте и посмотрите, что нужно сделать, чтобы это заработало.

...