有没有一种非Java、跨平台的方式来启动与某种文件类型关联的应用程序?

9

首先,我找到了一些关于Java的特定问题的问答。我正在寻找更多“本地”的跨平台解决方案,使用C、C++、某种脚本语言或者在我的情况下是Qt。

因此问题是,是否有标准的跨平台方法来以编程方式打开某些文件类型的相关应用程序。或者至少找出是否有关联的应用程序并能够定位和启动它们?

所谓的跨平台是指Windows、OSX和Linux(Gnome/KDE)。具体用例是将存储为BLOB的文件作为数据库,在这三个不同的目标上进行读取。

3个回答

12

我不知道任何跨平台的方法。

在Windows中,有一个start命令,它将启动关联的默认应用程序。(例如,start foo.doc将启动默认的Word文档编辑器,start http://StackOverflow.Com/将启动默认的Web浏览器,而start mailto:mail@example.com则启动默认的邮件应用程序。)

在OS X中,有open命令,也是做同样的事情。

Linux只是一个操作系统内核。操作系统内核并不知道任何关于“文件类型”、“MIME类型”或“相关应用程序”之类的东西。因此,这样的东西在Linux上根本是不存在的。

Freedesktop组有一个规范的xdg-open命令,它适用于所有符合Freedesktop标准的图形桌面环境(无论是Linux、FreeBSD、NetBSD、OpenBSD、DragonflyBSD、OpenSolaris还是其他)。然而,它显然不能保证在非Freedesktop系统上工作,当然也不能保证在非图形化系统上工作。

在这三种情况下,这是一个命令行应用程序,不是C或C++ API,但显然可以通过system调用它。


1
谢谢,xdg-open 是缺失的部分。另外,请原谅我将“Linux”作为那种操作系统的通用术语。我认为这里的每个人都知道它是一个内核,但仍然理解意思。 - FeatureCreep
1
我知道在这些事情上我可能有点追求完美,但在我看来,在这些问题上正确性非常重要:绝大多数的 Linux 计算机并不支持 xdg-open!我的手机、DVD 播放器、有线电视解码器、硬盘录像机、NAS 盒子和 PDA 都运行着 Linux,但它们中没有一个有 xdg-open。此外,全球的每一台 TiVo 和几乎所有 WiFi 或宽带路由器都运行着 Linux,但它们中也没有一个有 xdg-open。另一方面,许多 FreeBSD、NetBSD 等桌面系统,虽然不是运行 Linux 但符合 XDG 标准,它们是有 xdg-open 的。 - Jörg W Mittag
1
所以,这确实与Freedesktop规范有关,与Linux无关。 - Jörg W Mittag
3
是的,我理解你的回答提到了freedesktop,并且我认为你的回复清晰明了。然而,考虑到上下文,我不认为许多读者会认为问题中的“Linux”一词是字面意义上的Linux内核,而是作为指向操作系统版本的一个指针。这至少是我和我认识的许多人在日常使用中的方式。 - FeatureCreep

6

既然您已经提到您正在使用Qt,那么值得一提的是QDesktopServices类,特别是openUrl(QUrl)方法。这个方法在Qt支持的所有平台上都可以实现您所描述的功能。


谢谢,这个解决方案比“system(...)”解决方案更适合我的特定问题,尽管那个解决方案可能更通用。 - FeatureCreep

1

在C语言中有系统调用,例如:

system("main.cpp");

这将使用默认编辑器(在我的情况下是Visual Studio)打开文件。我不确定Linux和Mac,你可能需要在那里写“open main.cpp”(这可以通过#ifdef结构来处理)。


1
好的,这在Windows上可以运行(你的测试),在Mac上也可以(我刚刚测试过)。如果有Linux变体,那么这将是答案。我在我的OSX和Linux盒子上尝试了system(“bla.txt”),但它没有起作用,但是使用“open bla.txt”在我的Mac上可以工作。 - FeatureCreep

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接