FileSystem
概括:
node js 包含一个module 允许我们和filesystem交互
这个模组允许我们 创造文件 更改文件 列举文件 读写文件
摘要:
-- 列出文件:
首先我们要涵盖这个module在我们的文件中
var fs = require('fs');
var files = fs.readdirSync('./lab');
console.log(files);
# 读取lab文件中的所有文件
# print 这些文件
# 这些文件以array的形式出现
Warning:
如果同步读取文件夹 会阻止 nodejs 的 单线程运动
一般来说 sync 同步读取 只会在 启动file的时候
不同步读取方程 不能返回一长串结果
readdir('./lab', function(err, files) {
if(err) {
throw err;
}
console.log(file);
});
-- 读取文件
我们能在 text 和 binary file 中 读取内容
如果要读 text file, 我们要明确text encodind, ‘UFT-8’
如果不然 function只会把我们的文件以 binary 格式阅读出来
----------------------
同样的, readfile 也分成 同步 和 非同步
同步 回直接return 所读取文件
例如:
var fs = require("fs");
var contents = fs.readFileSync("./lab/book.txt");
console.log(contents);
非同步情况: return的东西会被 callback function 得到
我们结合一下 readdir 和 readfile 方程
我们尝试去读取所有file 内容在这个目录中 除去DS 后缀隐藏的 data source file
var fs = require("fs");
var path = require("path");
fs.readdir("./lib", function(err, files) {
files.forEach(function(fileName) {
var file = path.join(__dirname, "lib", fileName);
var stats = fs.statSync(file);
if(stats.isFile() && fileName !== ".DS_Store") {
fs.readFile(file, "UTF-8", function(err, contents) {
console.log(contents);
});
}
});
});
--创造 / 写入 文件
创造文件
fs.writeFile("sample.txt", context, function(err) {
console.log(File Created);
});
第三个args 的callback function 在成功运行 也会激活
——————————————————
append file
fs.appendFile("sample.txt", context, function(err) {
console.log(File Created);
});
callback function 在这俩个方程之间 都是 可加或者不加的
不是 必须的
--创造文档
首先 还是要 导入filesystem文件
var fs = reuqire('fs');
fs.mkDir("dirname", function(err) {
console.log(File Created);
});
这样一个dir就被创造出来了
漏洞/完善
但是如果我们连续运行俩次程序
就会发现 error 显示文档已经被创建过 因此 检测是否已存在 是完善的步骤
var fs = require("fs");
if (fs.existsSync("lib")) {
console.log("Directory already there");
} else {
fs.mkdir("lib", function(err) {
if (err) {
console.log(err);
} else {
console.log("Directory Created");
}
});
}
在这里使用 Sync 的原因是 我们知道只有单线程在运作 不会和别的进程 冲突
-- 更名/删除 文件/文档
更名
相对于 删除文件来说 好于 理解一些
不需要太多解释 先放上 例子
var fs = require("fs");
fs.renameSync("./lib/project-config.js", "./lib/config.json");
console.log("Config json file renamed");
fs.rename("./lib/notes.md", "./notes.md", function(err) {
if (err) {
console.log(err);
} else {
console.log("Notes.md moved successfully");
}
});
第一个是 我们想更改的
第二个的是 要更改的名字
如果有error的话 会自动 print 出来
————————————
我们可以更改名字的时候移动 file 的位置
————————————————————————————
删除文件
文件就像是一个数 从顶端的 root
一个 node 一个 node 连接下来
因此删除一个文件 就像是 unlink一个 node一样
var fs = require("fs");
try {
fs.unlinkSync("./lib/config.json");
} catch (err) {
console.log(err);
}
fs.unlink("notes.md", function(err) {
if (err) {
console.log(err);
} else {
console.log("Notes.md removed");
}
});
try catch 是 手动处理收到的 error 消息
如果不加的话 如果有error 是会自动生出 来的
——————————————
改名文档 和 删除文档 是一样的道理
改名 是一样的方程
rename
但是删除的话
是 rmdir
但是当我们删除了一个文档的时候, 我们不能删除一个包含文件的文档
我们必须首先清空所有的file 在 dir 中
以下是例子删除一个dir
var fs = require("fs");
fs.readdirSync("./logs").forEach(function(fileName) {
fs.unlinkSync("./logs/" + fileName);
});
fs.rmdir("./logs", function(err) {
if (err) {
throw err;
}
console.log("Logs directory removed");
});
--读入 流
readable file streams 和 readfile 有异曲同工之妙
但是区别在于
如果对于一份特别大的文件
读入流 会一步一步的 读
但是 readfile 会等待加载完 造成速度影响
var fs = require("fs");
var stream = fs.createReadStream("./chat.log", "UTF-8");
var data = "";
stream.once("data", function() {
console.log("\n\n\n");
console.log("Started Reading File");
console.log("\n\n\n");
});
stream.on("data", function(chunk) {
process.stdout.write(` chunk: ${chunk.length} |`);
data += chunk;
});
stream.on("end", function() {
console.log("\n\n\n");
console.log(`Finished Reading File ${data.length}`);
console.log("\n\n\n");
});
stream on 是 action listen, 我们能发现 stream中读到的数据 是一块一块出现的
stream.on 是为了检测每块chunk的长度
运行结果:
--写入 流
一块一块的写入 不会一起写入 节省空间
现在结合以上所学的
var readline = require('readline');
var rl = readline.createInterface(process.stdin, process.stdout);
var fs = require("fs");
var realPerson = {
name: '',
sayings: []
};
rl.question("What is the name of a real person? ", function(answer) {
realPerson.name = answer;
//
// TODO: Use a Writable Stream
//
fs.writeFileSync(realPerson.name + ".md", `${realPerson.name}\n==================\n\n`);
rl.setPrompt(`What would ${realPerson.name} say? `);
rl.prompt();
rl.on('line', function(saying) {
realPerson.sayings.push(saying.trim());
//
//TODO: Write to the stream
//
fs.appendFileSync(realPerson.name + ".md", `* ${saying.trim()} \n`);
if (saying.toLowerCase().trim() === 'exit') {
rl.close();
} else {
rl.setPrompt(`What else would ${realPerson.name} say? ('exit' to leave) `);
rl.prompt();
}
});
});
rl.on('close', function() {
console.log("%s is a real person that says %j", realPerson.name, realPerson.sayings);
process.exit();
});
更多
stream 是很关键的 对于 HTTP module
HTTP 恰巧也是 整个Node js 重要的部分
-- Author: Cvanzy