Вызовите внешний текстовый редактор, такой как nano, sublime-text или gedit, в зависимости от того, какой из них установлен, и, возможно, от пользовательских настроек. Подождите, пока пользователь не отредактирует файл и не закроет текстовый редактор.
Интересный вопрос. Один из способов открыть файл xml с помощью редактора пользователя по умолчанию - использовать xdg-open , но он не дает pid
приложения, в котором пользователь будет редактировать файл.
Вы можете использовать xdg-mime query default application/xml
, чтобы узнать файл .desktop
редактора по умолчанию, но затем вам нужно проанализировать этот файл, чтобы выяснить путь к исполняемой программе - это точно как xdg-open на самом деле работает , в функции search_desktop_file () строка, начинающаяся с записи Exec=
, просто извлекается из *.desktop
для вызова исполняемого файла редактора и передачи целевого файла в качестве аргумента ... Что Я пытаюсь сказать, что после того, как вы найдете исполняемый файл редактора, вы можете запустить его и подождать, пока он не закроется, а затем проверить, изменилось ли содержимое файла. Ну, это выглядит как много ненужной работы ...
Вместо вы можете попробовать исправленный широко известный редактор, такой как gedit
, для достижения желаемого рабочего процесса. Вы также можете предоставить пользователю способ (т. Е. Приглашение или файл конфигурации) установить редактор XML по умолчанию, т.е. /usr/bin/sublime_text
, который затем можно будет использовать в вашей программе при следующем запуске.
Однако ключ здесь, чтобы открыть редактор, который блокирует вызывающий процесс, пока пользователь не закроет редактор. После закрытия редактора вы можете просто проверить, был ли файл изменен, и если это так, выполнить дальнейшие операции.
Чтобы выяснить, изменилось ли содержимое файла, вы можете использовать системный вызов stat
, чтобы получить inode change time
файла, прежде чем открыть файл, а затем сравнить значение метки времени с текущим значением. как только он будет закрыт.
то есть:.
stat -c %Z filename
Выход: 1558650334
Подведение итогов:
#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
void execute_command(char* cmd, char* result) {
FILE *fp;
fp = popen(cmd, "r");
fscanf (fp, "%s" , result);
}
int get_changetime(char* filename) {
char cmd[4096];
char output[10];
sprintf(cmd, "stat -c %%Z %s", filename);
execute_command(cmd, output);
return atoi(output);
}
int main() {
char cmd[4096];
char* filename = "path/to/xml-file.xml";
uint ctime = get_changetime(filename);
sprintf(cmd, "gedit %s", filename);
execute_command(cmd, NULL);
if (ctime != get_changetime(filename)) {
printf("file modified!");
// do your work here...
}
return 0;
}