4

任务:
我想创建自己的文件扩展名,以便当我单击特定的“点”文件时,我的程序会打开它。但是,我编写的这个程序只是一个中间人,它会做一些处理,但最终将该文件传递给另一个程序进行处理。

示例:
因此,例如,所有带有扩展名的纯文本文件.foo都将显示为好像使用gedit. 但真正发生的是,它们是用我的一个程序打开的,反过来,我的程序将该文件传递到gedit.

我的 c++ 程序执行此操作,如下所示:

#include <string>
#include <cstdlib>

int main(int argc,  char** argv) {

    //open file with gedit
    system(("(gedit " + std::string(argv[1]) + " > /dev/null &)").c_str());

    //do other processing
    //...
}

我相信当您单击一个文件并且操作系统告诉它使用某个程序打开时,该文件名作为该程序的第二个参数传递给 c++ 程序(作为索引 1,因为索引零是程序的姓名)。这&gedit作为后台进程运行的,并且()语句周围的额外内容确保gedit在关闭父 shell 时不会关闭。

问题:
话虽如此,当我将二进制文件放在我的 $PATH 变量中列出的文件夹中并且我从传递文件的命令行运行程序时,该程序可以正常工作,就好像它被单击一样。但是,当我实际设置要使用程序打开的文件时,它不起作用。

我如何设置在文件点击时运行程序:
我运行了在这个问题的答案中找到的脚本,当我点击文件时,
程序确实出现了,Right Click->Properties->Open With 在此处输入图像描述
但似乎什么也没发生。我什至将程序置于无限循环中并检查它是否作为进程运行,但事实并非如此。为什么程序根本没有被调用?还是因为某种原因它被调用并立即关闭?那个脚本不能做我需要的一切吗?我需要采取其他步骤吗?我应该尝试注册程序并以不同的方式将其与文件扩展名相关联吗?

我在 Ubuntu 上。

4

1 回答 1

0

您可能只是打开一个终端并调查环境:

int main(int argc,  char** argv) {
    std::system("gnome-terminal");
}
于 2014-01-31T13:50:06.623 回答