Ich muss einen Tarball eines Verzeichnisses erstellen und dann mit bz2 in C++ komprimieren. Gibt es ein anständiges Tutorial zur Verwendung von Libtar und libbz2?Wie komprimiere ich ein Verzeichnis mit libbz2 in C++
10
A
Antwort
1
Angenommen, dies ist nicht nur eine Frage "Wie kann ich das tun?", Dann ist der naheliegende Weg, GNU tar zu forcieren, um es für Sie zu tun. Der einfachste Weg ist mit der System (3) Bibliotheksroutine:
system("/path/to/gtar cfj tarballname.tar.bz2 dirname");
Nach this gibt es Beispielprogramme in der libtar disty sind.
Die Dokumentation von Bzip enthält einen Abschnitt zu programming with libbz2.
15
Okay, ich habe ein schnelles Beispiel für Sie ausgearbeitet. Keine Fehlerprüfung und verschiedene willkürliche Entscheidungen, aber es funktioniert. libbzip2 hat ziemlich good web documentation. Libtar, nicht so sehr, aber es gibt Manpages im Paket, ein Beispiel und eine dokumentierte Header-Datei. Die folgenden können mit g++ C++TarBz2.cpp -ltar -lbz2 -o C++TarBz2.exe
gebaut werden:
#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;
}
Verwandte Themen
- 1. Wie komprimiere ich ein Busnetz?
- 2. C# Wie komprimiere ich den .ashx-Inhalt?
- 3. Wie gehe ich ein Verzeichnis in C
- 4. Wie komprimiere ich einen Puffer mit zlib?
- 5. Wie komprimiere ich ein PNG-Bild mit Hilfe von Java
- 6. Wie komprimiere ich JSON mit PHP?
- 7. Komprimiere animierte Gif Bildgröße mit C#
- 8. Wie erstelle ich ein Verzeichnis auf FTP-Server mit C#?
- 9. Wie erstelle ich ein Verzeichnis im aktuellen Verzeichnis in Node.js
- 10. In C, wie komme ich an ein bestimmtes Verzeichnis?
- 11. Ich kann nicht in ein Verzeichnis mit C++ gehen
- 12. Wie komprimiere ich eine bestimmte Datei mit Pipeline in Django?
- 13. Wie komprimiere ich eine Textdatei in Ubuntu mit Snappy
- 14. Wie überspringe ich ein Verzeichnis in awk?
- 15. Wie bekomme ich das aktuelle Verzeichnis in ein C-Programm?
- 16. Wie komprimiere/füge ich Expression-Objekte in R zusammen?
- 17. Wie kopiere ich Dateien mit MSBuild in ein anderes Verzeichnis?
- 18. Wie komprimiere ich E-Mail-Anhang Bild mit php?
- 19. Wie erstelle ich ein Verzeichnis in Emacs?
- 20. Wie entferne ich ein Verzeichnis in R?
- 21. Wie erzeuge ich Dateien und zip/komprimiere dann mit Heroku?
- 22. Wie erstelle ich ein Verzeichnis in Lua?
- 23. Wie komprimiere ich alle Ordner in IntelliJ IDEA?
- 24. Wie komprimiere ich Bilder mit Picasso Library für Android?
- 25. Wie komprimiere ich JPEG Bilder mit dem Webpack "Tinypng Way"?
- 26. Wie komprimiere ich JSON in Java und Dekomprimierung in Javascript
- 27. Wie komprimiere speichert in R-Paket Build
- 28. Wie komprimiere ich eine große Datei in Python?
- 29. Wie überprüfe ich, ob ein Verzeichnis mit SQL Server existiert?
- 30. Wie kann ich ein Verzeichnis mit .NET komprimieren?
Warum ist das der offensichtliche Weg? Wenn er das viel tut, wird der Prozess-Overhead signifikant werden. Ganz zu schweigen davon, dass er auf diese Weise die volle Kontrolle über die Möglichkeiten von bzip hat. Und natürlich sollten Sie sicherstellen, dass Sie Argumente beim Aufruf des Systems korrekt umgehen. –
weil es einfach ist, tut es, was benötigt wird, und es ist völlig unempfindlich gegenüber irgendwelchen kleinen Details des tar-Formats usw. Auf einem UNIX-Rechner ist zumindest fork/exec * relativ * billig. Also "offensichtlich" im Sinne von "Was ist die einfachste Sache, die funktionieren könnte?" –
Die Anfrage war für libbz2, nicht Aufruf von tar/bzip2 über fork/exec, um die Aufgabe zu erfüllen. – hd1