Node.js FileSystem 文件系统 (全方位概括)

7 篇文章 0 订阅

FileSystem

概括:

node js 包含一个module 允许我们和filesystem交互

这个模组允许我们 创造文件 更改文件 列举文件 读写文件 

摘要:

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

  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值