我正在开发qt,为c++代码开发接口,所以我想知道如何检查用户从打开的文件打开它的文件类型,因为程序只接受视频文件。如果一个文件不是视频文件,我想显示错误消息。
提前感谢:)
File"type"只是一种简化。在现代操作系统中,从操作系统的角度来看,所有磁盘文件都是相等的(它们只是字节序列),文件的"类型"只取决于读取/写入这些文件的程序。在过去,许多操作系统用来区分二进制文件和文本文件,但这些时代几乎已经完全过去了。
使文件类型"明显"的一种常见方法是使用命名约定。。。即,名称以".mpg"结尾的文件可能是使用MPEG标准编码的视频文件,或者".txt"文件可能包含人类可读文本。
因此,您有两种选择。。。要么你只是根据文件名过滤文件列表(例如,你只接受以".mp4"、".mpg"、"mpeg"、".avi"、".wmv"、".webm"、".ogg"结尾的文件…-仅举几个常见的视频文件扩展名),要么你只是试图将任何文件传递给程序,程序将决定是否可以播放。如果程序是一个好程序,如果它不能理解特定的文件格式,而不是崩溃,它就会正常地失败。
请注意,即使你使用Qt(一个便携式库),如果可接受的视频文件编码取决于操作系统,甚至取决于单个安装,我也不会感到惊讶(因为视频/编解码器通常是"插件",可能安装在系统上,也可能未安装在系统中)。
如果你真的想限制文件名,那么请记住添加一种方法来选择扩展名不在列表中的文件。每次你在程序中列举事情时,你首先都有点傲慢(列表意味着你知道所有可能的情况,你认为你真的知道吗?),你正在为未来的兼容性设置障碍(例如,播放器程序的下一个版本也将处理.wzz视频文件,但由于允许的扩展名列表中存在愚蠢的限制,您的程序将无法播放这些文件)。
您确实意识到,您已经可以使用类似QFileDialog的东西来过滤文件类型了,对吧?只要看一下文档,尤其是过滤器。有几个例子。
否则,只需检查文件扩展名。
比文件扩展名imho更可靠的方法是检查文件头。您需要读取文件的第一个字节(标头),看看它们是否与程序支持的视频容器格式之一匹配。
例如,windows AVI文件以十六进制字节开头:52 49 46 46("RIFF"),而MKV文件以1A 45 DF A3开头(如果我没记错的话)。
当然,这并不能保证你的系统能够真正播放这样的文件(这取决于你是否有合适的编解码器/过滤器,以及你的文件是否损坏),但它比检查扩展名更可靠,因为扩展名只是一个任意的名称,并不能真正告诉你文件中的实际内容。