这是我在写 Cikada 时遇到的一个小问题,发现利用 GIO 库的 GFileMonitor 类与 GLib 提供的 GMainLoop 主循环可以很方便的解决它。
#include <gio/gio.h> static void dir_is_changed (GFileMonitor *monitor, GFile *file, GFile *other, GFileMonitorEvent event_type, gpointer user_data) { if (event_type == G_FILE_MONITOR_EVENT_CREATED) g_print ("You just created '%s'!\n", g_file_get_path (file)); } int main (int argc, char **argv) { g_type_init (); GMainLoop *main_loop = g_main_loop_new (NULL, TRUE); GFile *file = g_file_new_for_path ("/tmp/cikada"); GFileMonitor * monitor = g_file_monitor_directory (file, G_FILE_MONITOR_NONE, NULL, NULL); g_signal_connect (monitor, "changed", (GCallback)dir_is_changed, NULL); g_main_loop_run (main_loop); g_object_unref (file); g_main_loop_unref (main_loop); return 0; }
上述代码的大意是:
编译并运行这个程序:
$ gcc `pkg-config --cflags --libs gio-2.0` test.c -o test $ ./test
然后在 /tmp/cikada 目录里随便建一些文件,这个程序便会咕噜出类似以下信息:
You just created '/tmp/cikada/4'! You just created '/tmp/cikada/5'! You just created '/tmp/cikada/6'!
如果要监视一个文件的变化,那么可以将 g_file_monitor_directory 替换为 g_file_monitor。
更多的信息请阅读: