1. 程式人生 > >Node.js學習筆記--fs模組

Node.js學習筆記--fs模組

1. fs.readFile(path,callback(err,data)):讀取檔案

有兩個引數,第一個是檔案的完整路徑,當前目錄寫./(必須要寫,為了相容Windows系統和Linux系統),第二個引數是回撥函式,表示檔案讀取完成之後做的事情

//可以證明事件環機制
var http=require("http");
var fs=require("fs");

var server=http.createServer(function(req,res){
	//不處理小圖示
	if (req.url == "/favicon.ico") {
		return;
	}

	//生成一個隨機的五位數id給使用者
	var userid=parseInt(Math.random() * 89999)+10000;
	console.log("歡迎"+userid);

	res.writeHead(200,{"Content-type":"text/html;charset=uft-8"});
	
	//兩個引數,第一個是完整路徑,當前目錄寫./
	//第二個引數是回撥函式,表示檔案讀取完成之後做的事情
	fs.readFile("./test/1.txt",function(err,data){
		if (err) {
			throw err;
		}
		console.log(userid+"檔案讀取完畢");
		res.end(data);
	});
});

server.listen(3000,"127.0.0.1");

2. fs.mkdir(path):以非同步的方式新建檔案目錄,如果目錄存在,則丟擲異常。
fs.mkdir("./test/fff");


3. fs.stat(path,callback(err,stats)):檢測檔案的狀態,處理是一個檔案還是一個目錄(true表示為一個目錄)

var http=require("http");
var fs=require("fs");

http.createServer(function(req,res){
	//不處理小圖示
	if (req.url=="/favicon.ico") {return;}

	fs.stat("./test/aaa",function(err,stats){
		//檢測這個路徑是不是一個資料夾(或者目錄)
		console.log(stats.isDirectory());//顯示結果為true
	});

	res.end();
}).listen(3000,"127.0.0.1");

4. fs.readdir(path,callback(err,files)):讀取該目錄下的所有檔案和目錄,並返回一個該目錄中包含的所有檔案和子目錄的陣列。
//強行讓非同步變成同步處理,不能用普通的for迴圈
var http=require("http");
var fs=require("fs");

http.createServer(function(req,res){
	//不處理小圖示
	if (req.url=="/favicon.ico") {return;}
	//儲存所有子目錄
	var dirs=[];
	fs.readdir("./test",function(err,files){
		//files是該目錄下的所有東西,包括檔案和子目錄,是一個數組
		//這個迭代器就是強行把非同步的函式變成同步的函式,一步一步進行
		(function iterator(i){
			//遍歷結束
			if (i==files.length) {
				console.log(dirs);
				return;
			}
			fs.stat("./test/"+files[i], function(err,stats){
				//檢測成功之後做的事,是目錄就放入陣列中
				if (stats.isDirectory()) {
					dirs.push(files[i]);
				}
				iterator(i+1);
			});
		})(0);
	});
	res.end();
}).listen(3000,"127.0.0.1");

5. 靜態資原始檔管理(讓一個資料夾成為一個根目錄),並且設定其MIME型別

var http=require("http");
var url=require("url");
var fs=require("fs");
var path=require("path");

http.createServer(function(req,res){
	// 不處理小圖示
	if (req.url=="/favicon.ico") {return;}
	//得到使用者的路徑
	var pathname=url.parse(req.url).pathname;

	//預設首頁
	if (pathname=="/") {
		pathname="index.html";
	}

	//獲取路徑中的副檔名
	var extname=path.extname(pathname);

	//去讀取這個檔案
	fs.readFile("./test/"+pathname, function(err,data){
		if (err) {
			//如果此檔案不存在,就返回404
			fs.readFile("./test/404.html", function(err,data){
				res.writeHead(404,{"Content-type":"text/html;charset=utf-8"});
				res.end(data);
			});
			return;
		};

		//MIME型別就是text/html,image/jpg
		getMime(extname, function(mime){
			res.writeHead(200, {"Content-type":mime});
			res.end(data);
		});
	});
}).listen(3000,"127.0.0.1");

function getMime(extname, callback){
	//讀取mime.json檔案,
	fs.readFile("./mime.json", function(err,data){
		if (err) {
			throw Error("找不到mime.json檔案");
			return;
		}

		//轉成JSON
		var mimeJson=JSON.parse(data);
		var mime =mimeJson[extname] || "text/plain";
		//執行回撥函式,mime型別字串就是它的引數
		callback(mime);
	});
};