задача:
Я хочу создать собственное расширение файла, чтобы при нажатии на определенный файл с точкой моя программа открывала его. Однако эта программа, которую я написал, является всего лишь посредником в том смысле, что она выполняет некоторую обработку, но в конечном итоге передает этот файл другой программе для обработки.
пример:
Так, например, все текстовые файлы с расширением .foo
будут отображаться так, как если бы они открывались с расширением gedit
. Но на самом деле происходит то, что они открываются одной из моих программ, а моя программа, в свою очередь, передает этот файл на gedit
.
моя программа на С++ для этого выглядит так:
#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
//...
}
Я считаю, что когда вы нажимаете на файл, и операционная система говорит, что его нужно открыть с помощью определенной программы, это имя файла передается программе на С++ в качестве второго аргумента этой программы (как индекс 1, поскольку нулевой индекс - это программа). название). &
означает, что gedit
запускается как фоновый процесс, а дополнительный ()
вокруг инструкции гарантирует, что gedit
не будет закрыт при закрытии родительской оболочки.
проблема:
С учетом всего сказанного, эта программа работает правильно, когда у меня есть двоичный файл, находящийся в папке, которая указана в моей переменной $PATH, и я запускаю программу из командной строки, передавая файл, как если бы он был нажат. Однако это не работает, когда я на самом деле устанавливаю файл для открытия с помощью программы.
как я настроил запуск программы при щелчке по файлу:
я запустил скрипт, найденный в ответ на этот вопрос,
и программа ДЕЙСТВИТЕЛЬНО появляется, когда я Right Click->Properties->Open With
но ничего не происходит, когда я нажимаю на файл. Я даже поместил программу в бесконечный цикл и проверил, работает ли она как процесс, но это не так. Почему программа вообще не вызывается? Или он вызывается и просто сразу закрывается по какой-то причине? Разве этот скрипт не делает все, что мне нужно? Есть ли дополнительные шаги, которые мне нужно предпринять? Должен ли я попробовать зарегистрировать программу и связать ее с расширением файла по-другому?
Я на Убунте.
test_program
? Где-то на вашем пути может быть недостаточно, если ваш путь отличается от системного пути. Вы можете добавить код, который создает файл в/tmp
, чтобы окончательно проверить, вызывается ли ваша программа. - person user4815162342   schedule 31.01.2014PATH
обычно модифицируется в оболочке и влияет только на оболочку и программы, запущенные из нее. Окружение рабочего стола, с другой стороны, запускается раньше оболочки, поэтому измененияPATH
из оболочки не влияют на нее. Система, скорее всего, не может найти вашу программу. Стандартное системное место для установки мелких несистемных программ —/usr/local/bin
. - person user4815162342   schedule 31.01.2014