0

gzip された tarball 内の特定のディレクトリに *.cpp ファイルをアーカイブする必要があります。プログラムから特定の結果セットを生成したコード (たとえば、どのソース コード ファイルのどのバージョン) を正確に文書化する手段として、これを実行時に実行する必要があります。

というわけで、以下の関数を書きました。通常は問題なく動作しますが過去に 1 回か 2 回失敗しました。何が起こったのか正確には思い出せませんがsystem()、c++ プログラムでファイルの削除とアーカイブを実際に行うのではなく、 を使用したためだと思ったことを覚えています。

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() );
}

上記の関数の最初の 2 行は、作成しようとしているアーカイブ ( ) と同じ名前の既存のファイルが存在する場合は、単純に削除しますdestinationFile。最後の 2 行はそれぞれ、現在の作業ディレクトリにあるすべての .cpp ファイルの tarball を作成し、その tarball を gzip します。

STL または Boost ライブラリを使用してこの関数を書き直すにはどうすればよいですか?

私は Boost ライブラリの使用に非常に不慣れで、C++ でのファイルシステム管理に関してはまったく無知です。

4

1 に答える 1

3

STL には、ファイルを圧縮および解凍する機能はありません (一部の圧縮方式によると)。

そうは言っても、あなたのニーズを満たすはずの lz4 ( link ) という小さなライブラリがあります。から取得したスニペット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);

boost::iostreams、つまりboost::iostreams::gzipを使用できる場合は、組み込みのgzip機能もあります

于 2013-06-15T21:23:24.030 に答える