快速瞭解Node.JS中的文件系統

文件系統

文件寫入

需要引入模塊

var fs = require("fs");

同步和異步的調用

  • fs模塊中所有的操作都有兩種形式可供選擇同步異步
  • 同步文件系統會阻塞程序的執行,也就是 除非操作完畢,否則不會向下執行代碼。
  • 異步文件系統不會阻塞程序的執行,而是 在操作完成時,通過回調函數將結果返回。

同步文件的寫入

  1. 打開文件

fs.openSync(path, flags[, mode])

  • path 要打開文件的路徑
  • flags 打開文件要做的操作的類型
    • r 只讀的
    • w 可寫
  • mode 設置文件的操作權限,一般不傳
  1. 寫入文件

fs.writeSync(fd, string[, position[, encoding]])

  • fd 文件的描述符,需要傳遞要寫入的文件的描述符
  • string 要寫入的內容
  • position 寫入的起始位置
  • encoding 寫入的編碼,默認utf-8
  1. 關閉文件

fs.closeSync(文件標識符);

// 引入文件系統模塊
var fs = require("fs");
//打開文件
var foo = fs.openSync("hellword.txt","w")
//向文件中寫入內容
fs.writeSync(foo,"我寫了一個內容在裏面")
//關閉文件
fs.closeSync(foo);

異步文件的寫入

  1. 打開文件

fs.open(path, flags[, mode], callback)

  • path 要打開文件的路徑
  • flags 打開文件要做的操作的類型
    • r 只讀的
    • w 可寫
  • callback 回調函數
  • 異步調用的方法,結果都是通過回調函數的參數返回的
  • 回調函數兩個參數:
    • err 錯誤對象,如果沒有錯誤則爲null
    • fd 文件的描述符
  1. 寫入文件

fs.write(fd, string[, position[, encoding]], callback)

  • 用來異步寫入一個文件
  • fd 文件的描述符,需要傳遞要寫入的文件的描述符
  • string 要寫入的內容
  • position 寫入的起始位置
  • callback 回調函數
  • 回調函數三個參數:
    • err 錯誤對象,如果沒有錯誤則爲null
    • written 寫入多少字節
    • string 寫入的內容
  1. 關閉文件

fs.close(fd, callback)

  • 用來關閉文件
//引入fs模塊
var fs = require("fs");

//打開文件
fs.open("yb.txt","w",function (err , fd) {
	// 判斷文件是否出錯
	if(!err){
		// 寫入文件
		fs.write(fd,"異步寫入值...",function(err){
			if(!err)
				console.log("寫入成功")
			// 關閉文件
			fs.close(fd,function(err){
				if(!err)
					console.log("文件已關閉")
			})
		})
		
	}else{
		console.log(err)
	}
});

同步與異步的區別

  • 同步文件系統會阻塞程序的執行,也就是 除非操作完畢,否則不會向下執行代碼。
  • 異步文件系統不會阻塞程序的執行,而是 在操作完成時,通過回調函數將結果返回。

簡單文件寫入

  • fs.writeFile(file, data[, options], callback)
  • fs.writeFileSync(file, data[, options])
    • - file 要操作的文件的路徑
    • data 要寫入的數據
    • options 選項,可以對寫入進行一些設置
      • encoding 設置編碼
      • mode 文件權限
      • flag
        • r 只讀
        • w 可寫
        • a 追加
    • callback 當寫入完成以後執行的函數
//引入fs模塊
var fs = require("fs");

// 異步
fs.writeFile("hello3.txt","這是通過writeFile寫入的內容", function (err) {
	if(!err){
		console.log("寫入成功~~~");
	}else{
		console.log(err);
	}
});
// 追加
fs.writeFile("hello3.txt","這是通過writeFile寫入的內容",{flag:"a+"}, function (err) {
	if(!err){
		console.log("寫入成功~~~");
	}else{
		console.log(err);
	}
});
// 同步
fs.writeFileSync("ybb.txt","這是同步寫入進去的")

// 絕對路徑寫入
fs.writeFile("C:/Users/Damon/Desktop/hello.txt","這是通過writeFile寫入的內容",{flag:"w"} , function (err) {
	if(!err){
		console.log("寫入成功~~~");
	}else{
		console.log(err);
	}
});

流式文件寫入

  • 同步、異步、簡單文件的寫入都不適合大文件的寫入,性能較差,容易導致內存溢出

  • 流式文件寫入可以解決大文件寫入問題

  1. 創建一個可寫流

var ws = fs.createWriteStream(path[, options])

  • 可以用來創建一個可寫流
  • path,文件路徑
  • options 配置的參數
  1. 寫入內容

.write(string)

通過ws.write(string)向文件中輸出內容

  1. 關閉流

end()

通過ws.end()關閉流

  1. 監聽流

可以通過監聽流的openclose事件來監聽流的打開和關閉

  • on(事件字符串,回調函數)
    • 可以爲對象綁定一個事件
  • once(事件字符串,回調函數)
    • 可以爲對象綁定一個一次性的事件,該事件將會在觸發一次以後自動失效

文件讀取

1.同步文件讀取 上同

2.異步文件讀取 上同

3.簡單文件讀取

4.流式文件讀取

簡單文件讀取

文件的讀取(包括文本文件、圖片、音頻文件)

返回值 data 爲buffer

var fs = require("fs");

fs.readFile("hellword.txt",function(err, data){
	if(!err){
		// 返回的一個Buffer,因爲可能文件格式不一樣,不一定是文本文件
        // 如果讀的文本文件,使用tostring()轉化即可
		console.log(data.toString())
	}
})

文件的複製 (包括文本文件、圖片、音頻文件)

var fs = require("fs");

// 複製圖片
fs.readFile("an.jpg",function(err, data){
	if(!err){
		fs.writeFile("fz.jpg",data,function(err, data){
			if(!err)
				console.log("文件複製成功")
		})
	}
})
// 複製音頻
fs.readFile("a.mp3",function(err, data){
	if(!err){
		fs.writeFile("b.mp3",data,function(err, data){
			if(!err)
				console.log("文件複製成功")
		})
	}
})

流式文件讀取

流式文件讀取也適用於一些比較大的文件,可以分多次將文件讀取到內存中

文件的讀取

var fs = require("fs");

//創建一個可讀流
var rs = fs.createReadStream("hellword.txt") // 會根據此處文件大小而改變文件的讀寫次數

//監聽流的開啓和關閉
rs.once("open",function(){
	console.log("打開可讀流")
})
rs.once("close",function(){
	console.log("關閉可讀流")
})


// 如果要讀取一個可讀流中的數據,必須要爲可讀流綁定一個data事件,data事件綁定完畢,它會自動開始讀取數據
rs.on("data",function(data){
	console.log(data.toString())
})

文件的複製

var fs = require("fs");

//創建一個可讀流

var rs = fs.createReadStream("b.mp3")
var ws = fs.createWriteStream("fz.mp3")
//監聽流的開啓和關閉
rs.once("open",function(){
	console.log("打開可讀流")
})
rs.once("close",function(){
	console.log("關閉可讀流")
	ws.end()	//記住一定在關閉可讀流後關閉可寫流
})

ws.once("open",function(){
	console.log("打開可寫流")
})
ws.once("close",function(){
	console.log("關閉可寫流")
})


// 如果要讀取一個可讀流中的數據,必須要爲可讀流綁定一個data事件
// data事件綁定完畢,它會自動開始讀取數據
rs.on("data",function(data){
	console.log(data)
	ws.write(data)
	
})

感覺上面方法太複雜了,換一個簡單一點的方式來搞定

  • pipe()可以將可讀流中的內容,直接輸出到可寫流中
var fs = require("fs");

//創建一個可讀流
var rs = fs.createReadStream("b.mp3");
//創建一個可寫流
var ws = fs.createWriteStream("pipe.mp3");

//pipe()可以將可讀流中的內容,直接輸出到可寫流中
rs.pipe(ws);

監聽可以根據自行去添加

Fs中的其他方法

檢查文件是否存在

fs.existsSync(path) 檢查一個文件是否存在

// 返回值 true / false
var isExists = fs.existsSync("a.mp3")

獲取文件的狀態

  • fs.stat(path, callback)

  • fs.statSync(path)

// 返回文件的許多信息
fs.stat("a.mp3", function(err, stat){
   console.log(stat)
})

刪除文件

  • fs.unlink(path, callback)
  • fs.unlinkSync(path)
// 刪除文件
fs.unlinkSync("hello.txt")

列出文件

  • fs.readdir(path[, options], callback)
  • fs.readdirSync(path[, options])
fs.readdir(".", function(er ,files){
    if(!err)
        console.log(files)
})

截斷文件

  • fs.truncate(path, len, callback)
  • fs.truncateSync(path, len)

將文件修改爲指定的大小

fs.truncateSync("hello.txt",10)

建立目錄

  • fs.mkdir(path[, mode], callback)
  • fs.mkdirSync(path[, mode])

創建目錄

fs.mkdirSync("office")

刪除目錄

  • fs.rmdir(path, callback)
  • fs.rmdirSync(path)
fs.rmdirSync("office")

重命名文件和目錄

  • fs.rename(oldPath, newPath, callback)
  • fs.renameSync(oldPath, newPath)
    • 參數
      • oldpath 舊的路徑
      • newpath 新的路徑
      • callback 回調函數

重命名

fs.rename("hello.txt","hh.txt", function(err){
    if(!err)
        	console.log("重命名成功")
})

剪切/移動

fs.rename("hello.txt","C:/Temp/hello.txt", function(err){
    if(!err)
        	console.log("移動成功")
})

監視文件

  • fs.watchFile(filename[, options], listener)
    • 參數
      • filename 要監視的文件的名字
      • options 配置選項
      • listener 回調函數,當文件發生變化時,回調函數執行
        • 參數,兩個對象都是stats對象
          • curr 當前文件狀態
          • prev 修改文件的狀態
fs.watchFile("hello.txt",function(curr, prev){
    console.log("修改前文件大小:"+ prev.size)
    console.log("修改後文件大小:"+ curr.size)
})
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章