【问题标题】:How to get the file format in C++/Qt如何在 C++/Qt 中获取文件格式
【发布时间】:2017-01-03 06:31:07
【问题描述】:

我需要编写一个程序来读取目录中每个文件的名称,以及文件的类型。虽然我可以获得文件名,但我无法获得我应该如何找到类型。我唯一能想到的就是使用它的元数据,但我什至不知道如何开始。 我正在尝试一个独立于操作系统的解决方案,但如果它也只能在 Windows 或 Linux 上运行,我会很高兴。

注意:请不要提供涉及搜索点的解决方案,以及介于两者之间的任何内容。这些天来,几乎没有文件有.pdf 或附加的东西。当你读取文件名时,你得到的只是sample,而不是sample.txt

另外,如果它与 Qt 不兼容,如果您能在回答中提及这一点,我将不胜感激,以便我可以采取适当的措施(由于 GUI,我正在使用 Qt)。

【问题讨论】:

  • “这些天来,几乎没有文件带有 .pdf 或其他附件。”什么?也许如果您使用 *nix 操作系统,但不是在 Windows 上,因为 Windows 依赖扩展名来知道文件的类型。而且由于大多数用户使用 Windows,我会说你不能这样概括它。
  • 如果要查找文件类型,请说出来。不要使用“扩展名”这个词,它与文件类型无关。
  • 如果您在 Windows 上,Windows 必须使用扩展名才能将文件与程序相关联。仅仅因为文件浏览器对 隐藏了它们,并不意味着它们不存在。
  • @Rakete1111 广大大多数用户使用 Android 操作系统。
  • 利用QFileInfo类或使用Boost。

标签: c++ qt file


【解决方案1】:

文件扩展名

正如@CMLDMR 指出的,QFileInfo::suffix()QFileInfo::completeSuffix() 方法将返回文件扩展名。但是,文件扩展名可能会被省略、无效、未知等。

因此,根据您的实际问题,您想知道文件格式,而不是first revision 中所述的扩展名。

文件格式

Qt 5 有一个类QMimeDatabase。它允许您通过其内容发现文件 MIME 类型。假设我们有一个没有扩展名的 mpeg 音乐文件:

QMimeDatabase db;
QMimeType mime = db.mimeTypeForFile("C:/music", QMimeDatabase::MatchContent);
qDebug() << mime.name();            // Name of the MIME type ("audio/mpeg").
qDebug() << mime.suffixes();        // Known suffixes for this MIME type ("mp3", "mpga").
qDebug() << mime.preferredSuffix(); // Preferred suffix for this MIME type ("mp3").

文件扩展名+文件格式

如果您仍然想优先考虑文件扩展名并仅在后缀存在时解析文件内容,请省略QMimeDatabase::MatchContent参数 - 将使用默认QMimeDatabase::MatchDefault。请参阅QMimeDatabase::MatchMode 了解更多信息。


请注意,Qt 对不同的操作系统使用不同的 MIME 数据库,因此结果可能会有所不同。

【讨论】:

    【解决方案2】:
    QFileInfo fi("/tmp/archive.tar.gz");
    QString ext = fi.suffix();  // ext = "gz"
    

    后缀功能是给你一个文件扩展名。

    QFileInfo fi("/tmp/archive.tar.gz");
    QString ext = fi.completeSuffix();  // ext = "tar.gz"
    

    你可以互相使用哪一个对你来说是正确的。 此代码独立但 Qt。

    详情LINK

    【讨论】:

    • 是的..这就是我要找的东西,但是如果我的文件类似于 /C/helloworld.这会给我一个 txt 作为 QString 吗?
    • 您的文件首先应该有一个扩展名。您可能看不到它(一些 Linux 文件浏览器将它们隐藏),但由于您面临的确切问题,您应该拥有它。操作系统无法猜测没有扩展名的文件是什么。查看文档,它不会返回任何内容,因为 Qt 只是查找最后一个点之后的内容。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2019-08-24
    • 2017-11-08
    • 1970-01-01
    • 2014-03-02
    • 2011-04-20
    • 2016-07-28
    • 1970-01-01
    相关资源
    最近更新 更多