如何确定文件是否在FAT系统上(看它是否真的可执行)

时间:2011-09-20 07:04:51

标签: c linux

我在一个独立于操作系统的文件管理器上工作,我将文件分组,通常基于扩展名。在Linux上,我检查文件是否具有可执行权限,如果有,我将其添加到可执行文件组。 这适用于Windows或Linux,但如果将它们组合起来则效果不佳。例如,在Linux上使用它并浏览Windows安装的驱动器时,所有文件似乎都是可执行的。我试图找到一种方法来忽略这些文件,而不是将它们添加到可执行文件组。 我的代码(在Linux上)使用stat:

#ifndef WINDOWS
stat(ep->d_name, &buf);
....
if(!files_list[i].is_dir && buf.st_mode & 0111)
files_list[i].is_exe=1;
#endif

3 个答案:

答案 0 :(得分:4)

答案的第一部分是找到文件挂载的文件系统。为此,您需要使用文件st_dev信息的stat字段查找文件系统。 (您也可以通过检查文件路径来执行此操作,但是您必须检查符号链接的每个路径元素。)

然后,您可以使用st_dev/proc/mounts中使用装载表交叉引用getmntent_r()字段。有an example of that in a previous answermnt_type字段将为您提供文件系统类型的文本,您需要将该字符串与Windows文件系统列表进行比较。

找到文件系统后,识别可执行文件的唯一方法是通过启发式方法。正如其他人建议的那样,您可以查看Windows可执行文件的文件扩展名,并查看Linux可执行文件的文件的初始字节。不要忘记带有#!前缀的可执行脚本,您可能需要读入Jar文件以确定它是否包含可执行的静态main()方法。

答案 1 :(得分:0)

如果您正在浏览Windows文件,则需要应用Windows规则来确定文件是否可执行。如果文件扩展名为.EXE,.COM,.BAT或.CMD,则它是可执行的。如果您想要更完整的列表,那么您应该检查MSDN。请注意,可以在计算机上添加注册表项,以使任何扩展名成为可执行文件,但最好在从网络浏览驱动器时忽略这种情况。

事实是你正在进行艰苦的战斗。所有文件都具有可执行权限的原因是Linux上的Windows文件系统驱动程序允许您将其指定为选项。例如,这掩盖了任何文件是否是Linux可排除的。

但是,您可以查看EVERY文件的文件头,看看它是否是Linux ELF可执行文件(就像Linux文件命令一样)。

首先检查已挂载文件系统的所有信息,以便了解您正在处理的内容,这可能会有所帮助。例如,您是否安装了CIFS文件系统,实际上是由SAMBA提供的Linux文件系统?如果您列举了有关已安装文件系统的所有可用信息以及完整的统计信息集,您可以识别出充当不同场景指纹的组合。

答案 2 :(得分:0)

我能想象的另一个选择是调用file util,并依赖于它的输出(也许它足以grep for words / script)。这个util存在/可编译为windows(基本上它只是检查文件中的一些魔术字节)。