【问题标题】:How do I open a file with my own program and have it invoke another program?如何使用自己的程序打开文件并让它调用另一个程序?
【发布时间】:2014-02-24 03:37:46
【问题描述】:

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

示例:
例如,所有带有扩展名.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,因为索引为零是程序的名称)。 &amp; 是为了让gedit 作为后台进程运行,并且语句周围的额外() 确保gedit 在父shell 关闭时不会被关闭。

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

我如何设置在文件点击时运行程序:
我跑了script found in the answer of this question,
当我Right Click-&gt;Properties-&gt;Open With 时,程序确实出现了
但是当我单击文件时似乎没有任何反应。我什至将程序置于无限循环中并检查它是否作为进程运行,但事实并非如此。为什么程序根本没有被调用?还是因为某种原因它被调用并立即关闭?那个脚本不能做我需要的一切吗?我需要采取其他步骤吗?我应该尝试注册程序并以不同的方式将其与文件扩展名相关联吗?

我在 Ubuntu 上。

【问题讨论】:

  • @它确实与系统路径不同。它位于我自己添加到路径中的某个本地文件夹中。它必须在 /usr/bin 中吗?哦,你知道吗,我只是使用程序名称而不是完整路径。我将尝试使用完整路径并更新我的答案是否有效。
  • 你把test_program放在哪里了?如果 your 路径与 system 路径不同,“路径上的某处”可能不够好。您可能希望添加在/tmp 中创建文件的代码,以最终检查您的程序是否正在被调用。
  • 您的PATH 通常在shell 中被修改,并且只影响shell 和从它启动的程序。另一方面,桌面环境在 shell 启动之前启动,因此从 shell 修改 PATH 不会影响它。系统很可能找不到您的程序。安装小型非系统程序的标准“系统”位置是/usr/local/bin

标签: c++ linux ubuntu file-extension open-with


【解决方案1】:

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

int main(int argc,  char** argv) {
    std::system("gnome-terminal");
}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2019-01-01
    • 2021-11-17
    • 2011-02-16
    • 1970-01-01
    • 1970-01-01
    • 2016-09-15
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多