2011-05-22 75 views
0

我正在开发qt来开发C++代码的接口,所以我想知道如何检查用户从打开的文件打开它的文件类型,因为程序只接受视频文件。如果文件是除视频文件之外的任何内容,我想要显示错误消息。关于打开错误文件的错误消息

在此先感谢:)

回答

2

文件“类型”只是一个简化。在现代操作系统上,从操作系统的角度来看,所有的磁盘文件都是相同的(它们只是字节序列),文件的“类型”仅取决于读取/写入这些文件的程序。过去,许多操作系统用于区分例如二进制文件和文本文件之间,但那些时间几乎完全消失。

使文件类型“显而易见”的常用方法是使用命名约定......即名称以“.mpg”结尾的文件可能是使用MPEG标准编码的视频文件,或者“.txt”文件可能包含人类可读的文本。

因此,您有两个选择...或者您只是根据文件名过滤文件列表(例如,您只接受以“.mp4”,“.mpg”,“.mpeg”,“.avi “,”.wmv“,”.webm“,”.ogg“... - 只是列举了一些常见的视频文件扩展名)或者您只是尝试将任何文件传递给该程序,程序将决定它是否可以播放它与否。如果程序是一个很好的程序,如果它不能理解一个特定的文件格式而不是崩溃,它会优雅地失败。

请注意,即使您使用的是Qt(便携式库),如果接受的视频文件编码取决于操作系统甚至是单一安装(因为视频/编解码器),我也不会感到惊讶编解码器通常是可能或可能未安装在系统上的“插件”)。

如果你真的想限制文件名,那么请记住添加一种方法来选择一个扩展名不在列表中的文件。每次你在你的程序中列举一些东西时,你首先会是傲慢的(一个列表意味着你知道所有可能的情况,你认为你真的这么做了吗?),并且你正在为将来的兼容性设置一个障碍(例如,播放器程序也会处理.wzz视频文件,但由于允许的扩展名列表中存在一个愚蠢的限制,您的程序将无法播放它们)。

1

你知道你已经可以用类似QFileDialog的东西过滤文件类型了吧?只需看看the documentation,特别是过滤器。有几个例子。

否则只检查文件扩展名。

0

比文件扩展名imho更可靠的一点是检查文件头。您需要读取文件的第一个字节(标题),并查看它们是否与您的程序支持的某个视频容器格式相匹配。

例如,一个windows AVI文件以十六进制字节开始:52 49 46 46(“RIFF”),而MKV文件以1A 45 DF A3开头(如果我没记错的话)。

这当然不能保证你的系统实际上可以播放这样的文件(这取决于你有合适的编解码器/过滤器,如果你的文件没有损坏),但它比检查扩展名更可靠只是一个任意的名字,并不真正告诉你任何有关文件内部的内容。