Versuch, die Bibliothek der 3. Party zu verwenden/einzuschließen/zusammenzustellen, libmagic. C/C ++ Filetyp -Erkennung

StackOverflow https://stackoverflow.com/questions/2105816

  •  21-09-2019
  •  | 
  •  

Frage

Nachdem ich nach einer Möglichkeit gesucht hatte, den Filetyp eines Dateistroms zu erkennen, stellte ich fest, dass die Unix Dateibefehl Verwendet Libmagic und ich versuche selbst die Bibliothek zu nutzen, aber ich kann es nicht zum Laufen bringen. Ich habe mich selten in meinem eigenen Code von Drittanbietern integriert, das ist also wahrscheinlich auch ein großer Teil meines Problems.

Warum:

Ich mache dies, weil ich eine tragbare GUI -Bild -Anzeige -App habe, mit der Archiv -Dateitypen (RAR, ZIP, MEHR?) Und dann die Bild -Dateitypen in der Bild -Dateitypen erkennen müssen. Ich hoffe, dass ich Libmagic für Windows und Linux (und Mac) verwenden kann. Wenn dies also nicht der Fall ist, halten Sie mich jetzt auf, weil ich etwas anderes finden muss.

Versuchen:

ich fand Jemand tut etwas Ähnliches, aber ich kann nicht folgen, was sie tun, und ich habe keine Ahnung, wie es irgendetwas kompiliert/ausführen kann, um herumzuspielen.

Mein erster Instinkt war es, so etwas wie zu tun:

// fileTypeTest.cpp, placed in file-5.03/src/ (source from link above)
#include <stdio.h>
#include "magic.h"
int main() {
  magic_t myt = magic_open(MAGIC_CONTINUE|MAGIC_ERROR/*|MAGIC_DEBUG*/|MAGIC_MIME);
  magic_load(myt,NULL);
  printf("magic output: '%s'\n",magic_file(myt,__FILE__));
  magic_close(myt);

  return 0;
}

Dann kompilieren Sie mit so etwas wie:

$ gcc magic.c -o magic.o
$ g++ fileTypeTest.cpp -o fileTypeTest magic.o

Welche (offensichtlich?) Funktioniert nicht. Ich weiß nicht einmal, wo ich anfangen soll, welche Fragen ich stellen soll oder ob dies die richtige Richtung ist, um mein ursprüngliches Problem überhaupt zu lösen.


EDIT: Jetzt habe ich

#include    <stdio.h>
#include    <magic.h>

int main(int argc, char* argv[]) {
  if (argc != 2) {
    printf("bad arguments");
    return 0;
  }
  magic_t myt = magic_open(MAGIC_CONTINUE|MAGIC_ERROR/*|MAGIC_DEBUG*/|MAGIC_MIME);
  magic_load(myt,NULL);
  printf("magic output: '%s'\n", magic_file(myt, argv[1]));
  magic_close(myt);

  return 0;
}

Kompilierung mit:

$ g++ -L/usr/lib -libmagic fileTypeTest.cpp -o fileTypeTest

Arbeiten. Ich musste jedoch zu Synaptik gehen und Libmagic-dev installieren. Ich muss testen, ob ich nur /usr/lib/libmagic.a in mein Quellverzeichnis kopieren kann, wenn ich meine App unter Windows's Mingw zusammenstellt, aber das wird später für eine weitere Frage dienen, nehme ich an.

War es hilfreich?

Lösung

__FILE__ ist ein reserviertes Vorverarbeitungssymbol, das zum Debuggen-/Protokollierungszweck verwendet wird. Betrachten Sie dies als Beispiel:

// This file is called test.c
char *p = NULL;
if (!(p = malloc((1 * sizeof(char) + 1)))){
   printf("Error in file: %s @ line %d\n\tMalloc failed\n", __FILE__, __LINE__);
   exit(-1);
}

Wenn der Anruf zu malloc fehlgeschlagen werden Sie die Ausgabe im obigen Beispiel wie folgt sehen:

Error in file: test.c @ line 23
       Malloc failed

Beachten Sie, wie der Code den ursprünglichen Quellcode aufnimmt. Das obige Beispiel zeigt die Verwendung davon.

Ich denke, Ihr Code sollte so etwas sein:

// fileTypeTest.cpp, placed in file-5.03/src/ (source from link above)
#include <stdio.h>
#include "magic.h"
int main(int argc, char **argv) {
  if (argc > 1){
     magic_t myt = magic_open(MAGIC_CONTINUE|MAGIC_ERROR/*|MAGIC_DEBUG*/|MAGIC_MIME);
     magic_load(myt,NULL);
     printf("magic output: '%s'\n",magic_file(myt,argv[1]));
     magic_close(myt);
  }
  return 0;
}

Der obige Code überprüft, ob ein Parameter in dieses Programm übergeben wird, und der Parameter wäre ein Dateiname, dh dh, dh argv[0] Punkte auf den ausführbaren Namen (die kompilierte Binärin), argv[1] zeigt auf das Array der Zeichen (eine Zeichenfolge), die den fraglichen Dateinamen angibt.

Um es zu kompilieren:

g ++ -i/usr/include -l/usr/lib/libmagic.so FiletestType.cpp -o Filetestype
g++ -L/usr/lib -lmagic fileTestType.cpp -o fileTestType

Bearbeiten: Vielen Dank Alok für den Hinweis auf den Fehler hier ...

Wenn Sie sich nicht sicher sind, wo sich die Libmagic befindet, suchen Sie sich in der/usr/local/lib und/usr/local/include - dies hängt von Ihrer Installation ab.

Sehen Sie sich dies an, um die vordefinierten Makros zu finden hier.

Hoffe das hilft, am besten, Tom.

Andere Tipps

Wo ist magic.h im Dateisystem? Findet es der Präprozessor? Wenn nicht, verwenden Sie -I<path>.

Ich weiß nicht, warum du den oben genannten "offensichtlich" denkst. Sehen Wie man C und C ++ mischt in dem C ++ FAQ für Details.

Sieht aus wie magic.h hat richtig extern "C" { } Gehege. Kompilieren Sie also Ihren Code mit g++ sollte schön funktionieren. Du kannst #include <magic.h> in deiner .cpp Datei und verwenden Sie alle libmagischen Funktionen.

  • Gibt es einen bestimmten Fehler, den Sie erhalten?
  • Ich habe die Libmagic -Funktionen nicht überprüft.
  • Sie müssen mit libmagic verlinken. Dein g++ Befehlsbedürfnisse -lmagic.
  • Seit magic.h ist höchstwahrscheinlich an einem Standardplatz, Sie sollten verwenden #include <magic.h>.

Sagen Sie uns, was Ihr Fehler für genauere Hilfe ist.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top