在寻找一种检测文件流的文件类型的方法之后,我发现了UNIX 文件命令 使用libmagic,我正在尝试自己使用图书馆,但我无法正常工作。我很少会自己整合第三方代码,因此这可能也是我问题的重要组成部分。

为什么:

我之所以这样做,是因为我有一个便携式GUI图像查看应用程序,该应用需要从给定的文件名中检测到存档文件类型(RAR,zip,更多?),然后在内部检测图像文件类型。我希望我可以将libmagic用于Windows和Linux(和Mac),因此,如果不是这种情况,请立即停止B/C,我需要找到其他东西。

试图:

我发现 有人做类似的事情, ,但是我无法遵循他们的工作,也不知道如何编译/运行任何东西开始搞砸。

我的第一个本能是做类似的事情:

// 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;
}

然后用类似的内容进行编译:

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

哪个(显然?)不起作用。我什至不知道从哪里开始寻找,要问什么问题,或者这是首先要解决我的原始问题的正确方向。


编辑:现在我有

#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;
}

编译:

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

作品。我不得不去突触并安装libmagic-dev。我必须测试以查看是否可以在Windows的mingW上编译我的应用程序时,是否可以将/usr/lib/libmagic.a复制到我的源目录中,但这将稍后再解决。

有帮助吗?

解决方案

__FILE__ 是用于调试/记录目的的保留预处理符号宏。以此为例:

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

如果打电话 malloc 失败了,您将在上述示例中看到输出:

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

注意代码如何访问原始源代码。上面的示例说明了这一点的用法。

我认为您的代码应该是这样的:

// 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;
}

上面的代码检查是否有一个参数传递到此程序中,该参数将是文件名,即 argv[0] 指向可执行的名称(编译的二进制), argv[1] 指向指示所讨论的文件名的字符阵列(一个字符串)。

编译它:

g ++ -i/usr/包括-l/usr/lib/libmagic.so filetesttype.cpp -o filetesttype
g++ -L/usr/lib -lmagic fileTestType.cpp -o fileTestType

编辑: 谢谢 Alok 在这里指出错误...

如果您不确定libmagic居住在哪里,请在/usr/local/lib和/usr/local/include中查找它,这取决于您的安装。

看到这一点以找到预定义的宏 这里.

希望这对汤姆有帮助,汤姆。

其他提示

哪里 magic.h 在文件系统中?预处理器是否找到它?如果没有,请使用 -I<path>.

我不知道为什么您认为上面的“显然”不起作用。看 如何混合C和C ++ 在里面 C ++常见问题解答 有关详细信息。

好像 magic.h 有适当的 extern "C" { } 外壳。因此,将您的代码编译 g++ 应该很好地工作。你可以 #include <magic.h> 在你的 .cpp 文件,并使用所有libmagic功能。

  • 您有一个特殊的错误吗?
  • 我尚未检查您对Libmagic功能的使用。
  • 您需要与libmagic链接。您的 g++ 命令需要 -lmagic.
  • 自从 magic.h 最有可能在标准的地方,您应该使用 #include <magic.h>.

告诉我们您的错误是什么,以获得更具体的帮助。

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top