文件系统

简略的文件系统读写操作应用uv_fs*函数和uv_fs_t构造体实现。

留神:libuv文件系统操作不同于套接字操作。套接字操作应用操作系统提供的非阻塞操作。文件系统操作在外部应用阻塞函数,然而在线程池中调用这些函数,并在须要应用程序交互时告诉注册到事件循环中的监督者。

所有文件系统函数都有两种模式——同步和异步。
如果回调为空,同步表单会主动被调用(并阻塞)。函数的返回值是一个libuv错误代码。这通常只对同步调用有用。当传递回调且返回值为0时,将调用异步表单。

读/写文件

关上文件描述符能够用

int uv_fs_open(uv_loop_t* loop, uv_fs_t* req, const char* path, int flags, int mode, uv_fs_cb cb)

flags和mode是规范的Unix标记。libuv负责转换为适当的Windows标记。
敞开文件描述符能够用

int uv_fs_close(uv_loop_t* loop, uv_fs_t* req, uv_file file, uv_fs_cb cb)

文件系统操作回调具备如下特色:

void callback(uv_fs_t* req)

让咱们看看cat的一个简略实现。咱们首先注册一个回调函数,用于文件关上时:
uvcat/main.c - 关上一个文件

void on_open(uv_fs_t *req) {    // The request passed to the callback is the same as the one the call setup    // function was passed.    assert(req == &open_req);    if (req->result >= 0) {        iov = uv_buf_init(buffer, sizeof(buffer));        uv_fs_read(uv_default_loop(), &read_req, req->result,                   &iov, 1, -1, on_read);    }    else {        fprintf(stderr, "error opening file: %s\n", uv_strerror((int)req->result));    }}

uv_fs_t的result字段是uv_fs_open回调时的文件描述符。如果文件胜利关上,咱们就开始读文件。
uvcat/main.c - 读回调

void on_read(uv_fs_t *req) {    if (req->result < 0) {        fprintf(stderr, "Read error: %s\n", uv_strerror(req->result));    }    else if (req->result == 0) {        uv_fs_t close_req;        // synchronous        uv_fs_close(uv_default_loop(), &close_req, open_req.result, NULL);    }    else if (req->result > 0) {        iov.len = req->result;        uv_fs_write(uv_default_loop(), &write_req, 1, &iov, 1, -1, on_write);    }}