所有。我正在尝试编写一个C ++程序,它将遍历用户指定的目录(例如/ home / alpernick / Pictures)。首先,这是为了确保没有重复(通过md5sum检查)。
但我真正想要包含的一个功能是确保文件名的扩展名与文件的类型匹配。
例如,如果文件的名称是" sunrise.png"我想确保它确实是一个PNG,而不是一个错误标记的JPEG(例如)。
我正在接近这个有四个功能,如下所示。
字符串扩展名(字符串fileName)//返回fileName的扩展名(包括.tar.gz处理,所以它不会盲目地返回最后3个字符)
string fileType(string fileName)//这一个是键 - 它返回实际的文件类型,因此如果名为fileName的文件是PNG,fileType()将返回PNG,无论返回值如何of extension()
string basename(string fileName)//重新生成文件的基本名称,即。扩展前的所有内容(因此,对于sunset.jpg,它将返回日落;对于fluffytarball,tar.gz,它将返回fluffytarball)
string renameFile(string incorrectFileName,string fileNameBeforeExtension,string actualFileType)//返回一个字符串,其值是与正确文件扩展名连接的基本名称。
string file = sunset.jpg;
/* Setting file to be hard-coded for illustrative purposes only */
if(extension(file) != fileType(file)
{
char fixedName [] = renameFile(file, basename(file), fileType(file));
puts(fixedName);
}
我对字符串处理没有任何问题。但是,我在fileType()上遇到了困难。我希望这个程序不仅可以在我的主机(Kubuntu 14.04)上运行,而且还能够在Windows机器上运行。因此,似乎我需要一些库或一组库,这两个库都是共同的(或者至少为两者编译)。
任何帮助/建议?
答案 0 :(得分:2)
除了基于其内容猜测文件实际类型的规则之外,还有其他例外情况。
由于文件可以有效且有用地解释为两种完全不同的文件类型,因此会加剧这种情况。
对于试图猜测数据不足的好程序,请在Unixoids上尝试file
。
答案 1 :(得分:1)
您可以尝试查看file
源代码:https://github.com/file/file。
但正如维基百科所述
文件的位置敏感测试通常通过将文件中的各个位置与幻数的文本数据库进行匹配来实现(参见“使用”部分)。这与其他更简单的方法不同,例如文件扩展名和MIME等方案。
在大多数实现中,file命令使用数据库来驱动探测前导字节。该数据库在名为magic的文件中实现,该文件的位置通常位于/ etc / magic,/ usr / share / file / magic或类似位置。
所以这似乎并不重要。