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