Node.js 提供一組類似 UNIX(POSIX)標準的文件操作API。 Node.js 文件系統(fs 模塊)模塊中的方法均有非同步和同步版本,例如讀取文件內容的函數有非同步的 fs.readFile() 和同步的 fs.readFileSync()。 非同步的方法函數最後一個參數為回調函數,回調函數 ...
Node.js 提供一組類似 UNIX(POSIX)標準的文件操作API。
Node.js 文件系統(fs 模塊)模塊中的方法均有非同步和同步版本,例如讀取文件內容的函數有非同步的 fs.readFile() 和同步的 fs.readFileSync()。
非同步的方法函數最後一個參數為回調函數,回調函數的第一個參數包含了錯誤信息(error)。
建議大家使用非同步方法,比起同步,非同步方法性能更高,速度更快,而且沒有阻塞。
創建 test.txt 文件
這是在test.txt中的內容
創建 main.js 文件
var fs=require("fs"); //非同步 fs.readFile("test.txt",function(err,data){ if(err){ return console.error(err); } console.log("非同步:"+data.toString()); }) //同步 var data=fs.readFileSync("test.txt"); console.log("同步:"+data.toString());
非同步模式下打開文件
fs.open(path, flags[, mode], callback)
-
path - 文件的路徑。
-
flags - 文件打開的行為。具體值詳見下文。
-
mode - 設置文件模式(許可權),文件創建預設許可權為 0666(可讀,可寫)。
-
callback - 回調函數,帶有兩個參數如:callback(err, fd)。
var fs=require("fs"); //非同步 fs.open("test.txt","r+",function(err,data){ if(err){ return console.error(err); } console.log("文件打開成功"); })
非同步模式獲取文件信息的語法格式:
fs.stat(path, callback)
-
path - 文件路徑。
-
callback - 回調函數,帶有兩個參數如:(err, stats), stats 是 fs.Stats 對象。
var fs=require("fs"); //非同步 fs.stat("test.txt","r+",function(err,stats){ if(err){ return console.error(err); } console.log(stats.isFile());//判斷是否是文件 })
var fs=require("fs"); //非同步 fs.stat("test.txt","r+",function(err,stats){ if(err){ return console.error(err); } console.log(stats.isFile());//判斷是否是文件 console.log(stats.isDirectory());//判斷是否是目錄 })
var fs=require("fs"); //非同步 fs.stat("test.txt",function(err,stats){ if(err){ return console.error(err); } console.log(stats); console.log(stats.isFile());//判斷是否是文件 console.log(stats.isDirectory());//判斷是否是目錄 })
非同步模式下寫入文件的語法格式:
fs.writeFile(file, data[, options], callback)
writeFile 直接打開文件預設是 w 模式,所以如果文件存在,該方法寫入的內容會覆蓋舊的文件內容。
-
file - 文件名或文件描述符。
-
data - 要寫入文件的數據,可以是 String(字元串) 或 Buffer(緩衝) 對象。
-
options - 該參數是一個對象,包含 {encoding, mode, flag}。預設編碼為 utf8, 模式為 0666 , flag 為 'w'
-
callback - 回調函數,回調函數只包含錯誤信息參數(err),在寫入失敗時返回。
var fs=require("fs"); //非同步 fs.writeFile("test.txt","這是新寫入的哈",function(err){ if(err){ return console.error(err); } console.log("數據寫入成功"); fs.readFile("test.txt",function(err,data){ if(err){ return console.error(err); } console.log(data.toString()); console.log("數據讀取成功"); }) })
非同步模式下讀取文件的語法格式:
fs.read(fd, buffer, offset, length, position, callback)
-
fd - 通過 fs.open() 方法返回的文件描述符。
-
buffer - 數據寫入的緩衝區。
-
offset - 緩衝區寫入的寫入偏移量。
-
length - 要從文件中讀取的位元組數。
-
position - 文件讀取的起始位置,如果 position 的值為 null,則會從當前文件指針的位置讀取。
-
callback - 回調函數,有三個參數err, bytesRead, buffer,err 為錯誤信息, bytesRead 表示讀取的位元組數,buffer 為緩衝區對象。
var fs=require("fs"); var buf=new Buffer.alloc(1024);//分配buffer //非同步 fs.open("test.txt","r+",function(err,fd){ if(err){ return console.error(err); } console.log("文件打開成功"); fs.read(fd,buf,0,buf.length,0,function(err,bytes){ if(err){ return console.error(err); } console.log(bytes+" 位元組被讀取"); //輸出讀取的位元組 if(bytes>0){ console.log(buf.slice(0,bytes).toString()); console.log("數據讀取成功"); } }) })
非同步模式下關閉文件的語法格式:
fs.close(fd, callback)
-
fd - 通過 fs.open() 方法返回的文件描述符。
-
callback - 回調函數,沒有參數。
var fs=require("fs"); var buf=new Buffer.alloc(1024);//分配buffer //非同步 fs.open("test.txt","r+",function(err,fd){ if(err){ return console.error(err); } console.log("文件打開成功"); fs.read(fd,buf,0,buf.length,0,function(err,bytes){ if(err){ return console.error(err); } console.log(bytes+" 位元組被讀取"); //輸出讀取的位元組 if(bytes>0){ console.log(buf.slice(0,bytes).toString()); console.log("數據讀取成功"); } //關閉文件 fs.close(fd,function(err){ if(err){ console.error(err); } console.log("文件關閉成功"); }) }) })
非同步模式下截取文件的語法格式:
fs.ftruncate(fd, len, callback)
-
fd - 通過 fs.open() 方法返回的文件描述符。
-
len - 文件內容截取的長度。
-
callback - 回調函數,沒有參數。
var fs=require("fs"); var buf=new Buffer.alloc(1024);//分配buffer //非同步 fs.open("test.txt","r+",function(err,fd){ if(err){ return console.error(err); } console.log("文件打開成功"); //截取文件 fs.ftruncate(fd,9,function(err){ if(err){ return console.error(err); } console.log("文件截取成功"); fs.read(fd,buf,0,buf.length,0,function(err,bytes){ if(err){ return console.error(err); } console.log(bytes+" 位元組被讀取"); //輸出讀取的位元組 if(bytes>0){ console.log(buf.slice(0,bytes).toString()); console.log("數據讀取成功"); } //關閉文件 fs.close(fd,function(err){ if(err){ console.error(err); } console.log("文件關閉成功"); }) }) }) })
刪除文件的語法格式:
fs.unlink(path, callback)
-
path - 文件路徑。
-
callback - 回調函數,沒有參數。
var fs=require("fs"); var buf=new Buffer.alloc(1024);//分配buffer //刪除文件 fs.unlink("test.txt",function(err){ if(err){ console.error(err); } console.log("文件刪除成功"); })
創建目錄的語法格式:
fs.mkdir(path[, options], callback)
-
path - 文件路徑。
-
options 參數可以是:
- recursive - 是否以遞歸的方式創建目錄,預設為 false。
- mode - 設置目錄許可權,預設為 0777。
-
callback - 回調函數,沒有參數。
var fs=require("fs"); var buf=new Buffer.alloc(1024);//分配buffer //創建目錄 fs.mkdir("temp/test/",function(err){ if(err){ return console.error(err); } console.log("目錄創建成功"); })
這個案例中必須保證temp目錄是存在的
可以添加 recursive: true 參數,不管temp是否存在:
var fs=require("fs"); var buf=new Buffer.alloc(1024);//分配buffer //創建目錄 fs.mkdir("temp/test/",{recursive:true},(err)=>{ if(err){ throw err; } console.log("目錄創建成功"); })
讀取目錄的語法格式:
fs.readdir(path, callback)
var fs=require("fs"); var buf=new Buffer.alloc(1024);//分配buffer //讀取目錄 fs.readdir("temp/test/",function(err,files){ if(err){ throw err; } files.forEach(function(file){ console.log(file); }) })
刪除目錄的語法格式:
fs.rmdir(path, callback)
var fs=require("fs"); var buf=new Buffer.alloc(1024);//分配buffer //刪除目錄 fs.rmdir("temp/test/",function(err){ if(err){ throw err; } console.log("刪除目錄成功"); })
這裡報錯了,因為我要刪除的目錄不是空目錄,得先保證目錄里沒有文件才能刪除目錄
以下再補充一些常用的操作方法,要看完整的請上官方文檔
fs.rename(oldPath, newPath, callback)
非同步 rename().回調函數沒有參數,但可能拋出異常。
fs.chmod(path, mode, callback)
非同步 chmod().回調函數沒有參數,但可能拋出異常。
fs.appendFile(filename, data[, options], callback)
非同步追加文件內容。
fs.watchFile(filename[, options], listener)
查看文件的修改。
fs.unwatchFile(filename[, listener])
停止查看 filename 的修改。
fs.exists(path, callback)
檢測給定的路徑是否存在。
fs.access(path[, mode], callback)
測試指定路徑用戶許可權。
fs.createReadStream(path[, options])
返回ReadStream 對象。