libuv学习笔记3------监控文件的变化

在libuv中可用uv_fs_event_t来发现并处理文件的变化。

用到的API函数也非常简单:

1.API函数介绍

1.1初始化uv_fs_event_t对象

int uv_fs_event_init(uv_loop_t* loop, uv_fs_event_t* handle);

1.2.启动监控

int uv_fs_event_start(uv_fs_event_t* handle,uv_fs_event_cb cb,const char* path,unsigned int flags);

参数1:uv_fs_event_t对象

参数2:当文件发生变化时的回调函数

参数3:文件路径名

参数4:flag,可选数值如下:

UV_FS_EVENT_WATCH_ENTRY:设置此标志可以监控子目录。官方注释中解释说是:使fs_event仅报告对目录条目本身的更改,但测试起来并不是(也可能是自己理解的有问题)。

UV_FS_EVENT_STAT:使用内核接口来监测文件的变化。此标志使fs_event定期调用stat();

UV_FS_EVENT_RECURSIVE:使用此标志,在监控目录时,将忽略子目录中的更改。

2.回调函数

void (uv_fs_event_cb)(uv_fs_event_t handle,const char* filename,int events,int status);

handle:上下文对象;

filename:果目录被监视,它代表发生改变的文件名。只在Linux和Windows上不为null,在其他平台上可能为null.

event:可能是UV_RENAME、UV_CHANGE或者两者都包含。

status:在这里为0.

3.示例代码:


#include 
#include 
 
#include 
 
uv_loop_t *loop;
const char *command;
 
void run_command(uv_fs_event_t *handle, const char *filename, int events, int status) {
    char path[1024];
    size_t size = 1023;
    // Does not handle error if path is longer than 1023.
    uv_fs_event_getpath(handle, path, &size);
    path[size] = '\0';
 
    fprintf(stderr, "Change detected in %s: ", path);
    if (events & UV_RENAME)
        fprintf(stderr, "renamed");
    if (events & UV_CHANGE)
        fprintf(stderr, "changed");
 
    fprintf(stderr, " %s\n", filename ? filename : "");
    system(command);
}
 
int main(int argc, char **argv) {
    if (argc <= 2) {
        fprintf(stderr, "Usage: %s   [file2 ...]\n", argv[0]);
        return 1;
    }
 
    loop = uv_default_loop();
    command = argv[1];
 
    while (argc-- > 2) {
        fprintf(stderr, "Adding watch on %s\n", argv[argc]);
        uv_fs_event_t *fs_event_req = malloc(sizeof(uv_fs_event_t));
        uv_fs_event_init(loop, fs_event_req);
        // The recursive flag watches subdirectories too.
        uv_fs_event_start(fs_event_req, run_command, argv[argc], UV_FS_EVENT_RECURSIVE);
    }
 
    return uv_run(loop, UV_RUN_DEFAULT);
}

你可能感兴趣的:(libuv学习笔记3------监控文件的变化)