以编程方式在 Linux 中查找文件类型

Posted

技术标签:

【中文标题】以编程方式在 Linux 中查找文件类型【英文标题】:Finding file type in Linux programmatically 【发布时间】:2013-01-20 09:28:31 【问题描述】:

我正在尝试查找 .pdf、.doc、.docx 等文件的文件类型,但以编程方式不使用 shell 命令。实际上我必须制作一个应用程序来阻止访问特定扩展名的文件。我已经在 LKM 中连接了 sys_call_table,现在我希望在触发打开/读取系统调用时,我的 LKM 会检查文件类型。

我知道我们有一个当前指针,它可以访问当前进程结构,我们可以使用它来查找存储在 dentry 结构中的文件名,并且在 Linux 中,文件类型由存储在起始字节中的幻数标识文件。但我不知道如何找到文件类型以及它的确切存储位置?

【问题讨论】:

为什么要重新发明***?只需致电file(或查看其源代码)。 有简单的方法和困难的方法。最简单的方法是使用system() 调用file,或者只是根据文件扩展名进行猜测。困难的方法是重新发明file:解析文件并根据内容确定其类型。 但是我在 c/c++ 中找到了文件类型。你能给出一个使用 system() 调用的代码示例吗? 不,我不是假设每个文件都有扩展名,因为在 Linux 中扩展名没有意义。因此文件类型由存储在文件内容开头的幻数标识 @RamizRaja “幻数”不是一个准确的描述,它是简写。这意味着来自文件本身的数据。例如,PNG 图像文件以an 8-byte header 开头,您当然可以很容易地找到它。 【参考方案1】:

Linux 不会“存储”其文件的文件类型(与 Mac OS 的 resource fork 不同,我认为这是最知名的执行此操作的平台)。文件只是命名的字节流,它们没有操作系统暗示的结构。

您要么只是告诉程序要使用哪个文件(然后它按照你说的做),要么程序使用更高级别的功能来解决它​​。

有些程序可以重新发明这个特定的***(我负责 one of those),但您也可以使用例如file(1)。当然,这需要您的程序解析和“理解”您将获得的文本输出,这在某种意义上只会解决问题。

但是,我不认为从内核空间调用file 是非常明智的,因此最好为您需要的任何类型集重新创建测试,以保持较小。

换句话说,我的意思是你应该简单地重新实现所需的测试。这通常是相当复杂的,所以如果你真的需要为尽可能多的类型做这件事,这可能不是一个好主意。 :/

【讨论】:

我需要支持任意五种文件类型。 重新创建测试的真正含义是什么? @Ramiz Raja 没有幻数,所以你(和文件工具)需要做的是识别文件类型,是读取文件中的第一条数据,然后猜猜是什么它是一种文件。这就是你必须在内核中创建的测试——读取一段文件,并尝试猜测它是哪种文件类型。 OK...那么如果我限制扩展/类型的数量,那么它将起作用。您能否给出任何代码示例来说明如何读取文件中的第一条数据。据我所知,每个文件系统都向 VFS 注册其函数,而 VFS 实际上调用这些函数进行读/写。那我怎样才能读取第一条文件数据?如果可以或建议一些链接,请提供代码示例。【参考方案2】:

实际上我必须制作一个应用程序来阻止访问特定扩展名的文件。

这是一个有缺陷的要求。如果您按文件扩展名检查,那么您将错过不使用扩展名的文件,这在 Linux 中很常见,因为它不使用文件扩展名。

官方认可的在 Linux 中检测文件类型的方法是使用幻数。 shell 命令file 基本上只是 libmagic 的一个包装器,因此您可以选择链接到该库

【讨论】:

这只是问题措辞方式的一个缺陷。我也看到了,所以我在 cmets 中专门询问了 OP,OP 承认:No i am not assuming that every file will have an extension

以上是关于以编程方式在 Linux 中查找文件类型的主要内容,如果未能解决你的问题,请参考以下文章

如何在 C/C++ 中以编程方式查找“保存的游戏”文件夹?

如何以编程方式在 iPhone 中查找可用内存?

Linux中如何查找文件夹 ?

Linux-Shell编程

Linux文件查找

Linux查找文件命令