libuv对文件操作的函数都封装在uv_fs开头的函数中,相关的handle就是uv_fs_t/uv_fs_s,我们来看一些它的定义
/* uv_fs_t is a subclass of uv_req_t */
struct uv_fs_s {
UV_REQ_FIELDS
uv_fs_type fs_type;
uv_loop_t* loop;
uv_fs_cb cb;
ssize_t result;
void* ptr;
const char* path;
uv_err_code errorno;
uv_statbuf_t statbuf; /* Stores the result of uv_fs_stat and uv_fs_fstat. */
UV_FS_PRIVATE_FIELDS
};
result属性是我们最常用的属性。
简单的cat命令
这个cat命令会把文件的全部内容显示在标准输出,代码如下
/*
* cat.cc
* linux下很多操作可以看作文件操作,如标准输入以及标准输出,使用libuv的fs时,
* 据个人经验,0表示标准输入,1,表示标准输出
* Created on: 2015年2月2日
*/
#include <stdlib.h>
#include <stdio.h>
#include <node/uv.h>
void on_open(uv_fs_t *req);
void on_read(uv_fs_t *req);
void on_write(uv_fs_t *req);
uv_fs_t read_req, open_req, write_req; //对应读取文件,打开文件,写文件
char buffer[1024]; //缓冲区大小,每次读取1024个字节
void on_open(uv_fs_t *req)
{
if(req->result != -1) //如果打开成功,result存储的就是文件句柄
{
uv_fs_read(uv_default_loop(), &read_req, req->result, buffer,
sizeof(buffer), -1, on_read);
}
else
{
fprintf(stderr, "error opening file: %d\n", req->errorno);
}
uv_fs_req_cleanup(req); //文件操作的相关回调函数,都必须有这么一条语句
}
void on_read(uv_fs_t *req)
{
uv_fs_req_cleanup(req);
if(req->result < 0)
{
fprintf(stderr, "Read error: %s\n", uv_strerror(uv_last_error(uv_default_loop())));
}
else if(req->result == 0)
{
uv_fs_t close_req;
uv_fs_close(uv_default_loop(), &close_req, open_req.result, NULL);
}
else //result存储的是读取文件的字节数
{
//注意第三个参数1,表示输出到标准输出
uv_fs_write(uv_default_loop(), &write_req, 1, buffer, req->result, -1, on_write);
}
}
void on_write(uv_fs_t *req)
{
uv_fs_req_cleanup(req);
if(req->result < 0)
{
fprintf(stderr, "Write error: %s\n", uv_strerror(uv_last_error(uv_default_loop())));
}
else
{
uv_fs_read(uv_default_loop(), &read_req, open_req.result, buffer, sizeof(buffer), -1, on_read);
}
}
int main(int argc, char **argv) {
if(argc < 2)
{
printf("you must input the path!\n");
}
else
{
//O_RDONLY,只读
uv_fs_open(uv_default_loop(), &open_req, argv[1], O_RDONLY, 0, on_open);
uv_run(uv_default_loop(), UV_RUN_DEFAULT);
}
return 0;
}
在命令行下,执行./cat filePath,就可以看到执行的结果啦。