Поскольку файловый монитор хранится в локальной переменной, он похож на другие переменные, уничтоженные (или в терминах GObject, завершенные / уничтоженные) в конце вызова функции
Чтобы обеспечить его достаточную продолжительность, вы должны сделать его полем в классе, тогда экземпляр FileMonitor «принадлежит» экземпляру этого класса, а не каждому вызову определенного метода
Демоверсия запуска (valac demo.vala --pkg gio-2.0
)
class FileMonitorDemo {
private FileMonitor monitor;
public void initFileMonitor() {
var path = Path.build_filename(Environment.get_home_dir(), ".local");
var file = File.new_for_path(path);
try {
monitor = file.monitor_directory(NONE);
message ("Monitoring: %s", file.get_path ());
monitor.changed.connect ((src, dest, event) => {
if (dest != null) {
print ("%s: %s, %s\n", event.to_string (), src.get_path (), dest.get_path ());
} else {
print ("%s: %s\n", event.to_string (), src.get_path ());
}
});
} catch (Error err) {
critical ("Error: %s\n", err.message);
}
}
}
void main () {
var filemon = new FileMonitorDemo();
filemon.initFileMonitor();
new MainLoop ().run ();
}