Переписать эту простую функцию, используя С++ STL/Boost вместо вызовов system()?

Мне нужно заархивировать файлы *.cpp в определенный каталог внутри tar-архива, сжатого с помощью gzip. Мне нужно, чтобы это происходило во время выполнения, чтобы точно документировать, какой код (например, какие версии каких файлов исходного кода) произвел определенный набор результатов программы.

Итак, я написал следующую функцию. Обычно это работает нормально, но в прошлом было один или два сбоя. Я не могу точно вспомнить, что произошло, но я помню, что думал, что это произошло из-за использования system() вместо фактического удаления и архивирования файла в программе на С++.

void saveSourceCode_TarGZ(string destinationFile) {
    system( ("rm -f " + destinationFile).c_str() );
    system( ("rm -f " + destinationFile + ".gz").c_str() );

    system( ("tar -cvf " + destinationFile + " ./*.cpp").c_str() );
    system( ("gzip " + destinationFile).c_str() );
}

Первые две строки в приведенной выше функции просто удаляют уже существующий файл с тем же именем, что и архив, который я пытаюсь создать (destinationFile), если он существует. Последние две строки, соответственно, создают tarball из всех файлов .cpp в текущем рабочем каталоге и сжимают этот tarball.

Как мне переписать эту функцию, используя библиотеки STL или Boost?

Я очень неопытен в использовании библиотек Boost, и я полный профан, когда дело доходит до управления файловой системой в С++.


person synaptik    schedule 15.06.2013    source источник


Ответы (1)


В STL нет функций для сжатия и распаковки файлов (в соответствии с некоторой схемой сжатия).

Тем не менее, есть небольшая библиотека под названием lz4 (ссылка), которая должна удовлетворить ваши потребности. Фрагмент взят из lz4.h:

//****************************
// Simple Functions
//****************************

int LZ4_compress        (const char* source, char* dest, int inputSize);
int LZ4_decompress_safe (const char* source, char* dest, int inputSize, int maxOutputSize);

Также есть встроенная функция gzip, если вы можете использовать boost::iostreams, а именно boost::iostreams::gzip

person rwols    schedule 15.06.2013