Ho bisogno di creare un archivio di una directory e poi comprimerlo con bz2 in C++. C'è qualche tutorial decente sull'uso di libtar e libbz2?Come comprimere una directory con libbz2 in C++
10
A
risposta
1
Supponendo che questa non sia solo una domanda "come posso fare", allora il modo ovvio è quello di fork/exec GNU tar di farlo per voi. Il modo più semplice è con il sistema (3) routine di libreria:
system("/path/to/gtar cfj tarballname.tar.bz2 dirname");
Secondo this, ci sono esempi di programmi nella disty libtar.
La documentazione di Bzip include una sezione su programming with libbz2.
15
OK, ho elaborato un rapido esempio per te. Nessun errore di controllo e varie decisioni arbitrarie, ma funziona. libbzip2 ha abbastanza good web documentation. libtar, non così tanto, ma ci sono manpage nel pacchetto, un esempio e un file di intestazione documentato. Il sottostante può essere costruito con g++ C++TarBz2.cpp -ltar -lbz2 -o C++TarBz2.exe
:
#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>
#include <stdlib.h>
#include <libtar.h>
#include <bzlib.h>
#include <unistd.h>
int main()
{
TAR *pTar;
char tarFilename[] = "file.tar";
char srcDir[] = "dirToZip/";
char extractTo[] = ".";
tar_open(&pTar, tarFilename, NULL, O_WRONLY | O_CREAT, 0644, TAR_GNU);
tar_append_tree(pTar, srcDir, extractTo);
close(tar_fd(pTar));
int tarFD = open(tarFilename, O_RDONLY);
char tbz2Filename[] = "file.tar.bz2";
FILE *tbz2File = fopen(tbz2Filename, "wb");
int bzError;
const int BLOCK_MULTIPLIER = 7;
BZFILE *pBz = BZ2_bzWriteOpen(&bzError, tbz2File, BLOCK_MULTIPLIER, 0, 0);
const int BUF_SIZE = 10000;
char* buf = new char[BUF_SIZE];
ssize_t bytesRead;
while((bytesRead = read(tarFD, buf, BUF_SIZE)) > 0) {
BZ2_bzWrite(&bzError, pBz, buf, bytesRead);
}
BZ2_bzWriteClose(&bzError, pBz, 0, NULL, NULL);
close(tarFD);
remove(tarFilename);
delete[] buf;
}
Problemi correlati
- 1. Come posso comprimere una directory con .NET?
- 2. Comprimere una directory di file con PHP
- 3. Come faccio a comprimere una directory di file usando C++?
- 4. Un modo migliore per comprimere i file in Python (comprimere un'intera directory con un singolo comando)?
- 5. Come comprimere una RowDefinition?
- 6. Come creare una directory temporanea in C++?
- 7. Come camminare una directory in C
- 8. È necessario comprimere un'intera directory utilizzando Node.js
- 9. SevenZipSharp - come comprimere più directory in un singolo file usando C#?
- 10. In C, come ottenere una directory specificata?
- 11. Collegamento un'applicazione per libbz2.so.1 piuttosto che libbz2.so.1.0
- 12. Come posso generare file e quindi comprimere/comprimere con Heroku?
- 13. plain C: apre una directory con fopen()
- 14. Comprimere e decomprimere le cartelle in C#
- 15. C# unisce una directory con un'altra
- 16. C# Come comprimere i contenuti .ashx?
- 17. Come comprimere una directory in un file zip a livello di codice
- 18. Trova file con pattern corrispondenti in una directory C#?
- 19. Come espandere/comprimere una sezione diff in Vimdiff?
- 20. Impossibile comprimere con mono?
- 21. Comprimere triangoli arbitrari in una scatola finita?
- 22. Comprimere più file JavaScript con YUIcompressor?
- 23. Leggi autorizzazioni per una directory in C#
- 24. Come comprimere più file usando solo .net api in C#
- 25. batch con determinate estensioni dalla più directory in una directory
- 26. Comprimere una stringa grande in rubino
- 27. Comprimere jpeg sul server con PHP
- 28. comprimere i file più individualmente con Gzip
- 29. Come comprimere un buffer con zlib?
- 30. Come comprimere una cartella WordprocessingML in docx leggibile
Perché è così ovvio? Se lo fa molto, il sovraccarico del processo diventerà significativo. Per non parlare del fatto che in questo modo ha il pieno controllo sulle opzioni di bzip. E, naturalmente, è meglio assicurarsi di sfuggire gli argomenti correttamente quando si chiama il sistema. –
perché è semplice, fa ciò che è necessario ed è completamente insensibile a qualsiasi piccolo dettaglio del formato tar ecc. Su una macchina UNIX, almeno, fork/exec è * relativamente * economico. Quindi, "ovvio" nel senso di "qual è la cosa più semplice che potrebbe funzionare?" –
La richiesta era per libbz2, non chiamando tar/bzip2 tramite fork/exec per eseguire l'operazione. – hd1