Как я могу контролировать каталог ~ / .local, используя Vala? - PullRequest
0 голосов
/ 04 июля 2018

Я пытаюсь отслеживать каталог ~ / .local в соответствии с Документация Vala Я могу правильно контролировать дом. но я не могу контролировать ~ / .local.

initFileMonitor V1:

public void initFileMonitor(){
    try {
        string homePath = Environment.get_home_dir();
        string filePath = homePath + "/.local";
        File file = File.new_for_path(filePath);
        FileMonitor monitor = file.monitor_directory(FileMonitorFlags.NONE, null);

        print ("\nMonitoring: %s\n", 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) {
        print ("Error: %s\n", err.message);
    }
}

вывод терминала (без ошибок, без мониторинга):

Monitoring: /home/srdr/.local

Ответы [ 2 ]

0 голосов
/ 05 июля 2018

Поскольку файловый монитор хранится в локальной переменной, он похож на другие переменные, уничтоженные (или в терминах 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 ();
}
0 голосов
/ 04 июля 2018

Вы должны запустить монитор, создав основной цикл и ожидая событий:

new MainLoop ().run ();
...