-
fs.stat檢測是文件還是目錄
-
-
fs.mkdir創(chuàng)建目錄
-
-
fs.writeFile創(chuàng)建寫入文件
-
-
fs.appendFile追加文件
-
-
fs.readFile異步讀取文件,(fs.readFileSync同步讀取文件)
-
-
fs.readdir讀取目錄
-
-
fs.rename重命名
-
-
fs.rmdir刪除目錄
-
-
fs.unlink異步刪除文件,(fs.unlinkSync同步刪除文件)
-
fs提供讀寫方法,對應(yīng)參數(shù):
- path:要打開的文件路徑活文件描述
- file:協(xié)議的URL對象作為fs操作的路徑
- flags:文件打開的模式
- mode:設(shè)置文件權(quán)限
flags的選項(xiàng)字符串及其含義
-
'a':打開文件用于追加。如果文件不存在,則創(chuàng)建該文件。 -
'a+':打開文件用于讀取和追加。如果文件不存在,則創(chuàng)建該文件。 -
'as+'打開文件用于讀取和追加(在同步模式中)。如果文件不存在,則創(chuàng)建該文件。 -
'r':打開文件用于讀取。如果文件不存在,則會(huì)發(fā)生異常。 -
'rs+':打開文件用于讀取和寫入(在同步模式中)。指示操作系統(tǒng)繞過本地的文件系統(tǒng)緩存。 -
'w+':打開文件用于讀取和寫入。如果文件不存在則創(chuàng)建文件,如果文件存在則截?cái)辔募?/li>
同步打開文件并寫入內(nèi)容
const fs = require('fs');
const fd = fs.openSync('./test.txt', 'rs+');
fs.write(fd, 'How are you?', (err, written, str) => { // 向fd所指向的文件添加內(nèi)容
if (err) throw err; // 如果寫入失敗將拋出錯(cuò)誤
console.log(written); // 返回寫入的字符串的所占字節(jié)數(shù)(注意:1個(gè)漢字占3個(gè)字節(jié))
console.log(str); // 返回寫入的文件內(nèi)容
})
異步打開文件并寫入內(nèi)容
const fs = require('fs'); // 操作文件必須引入fs文件模塊(包)
fs.open('./test.txt', 'rs+', (err, fd) => { // 以異步方式打開文件,fd為文件指針,指向所打開的文件
if (err) {
console.log('文件打開失??!');
return false;
}
/*
fs.write(fd,string[,position[,encoding]], callback) 一般不用
用于將 string 寫入到 fd 指定的文件
--fd 文件路徑或文件描述符,必選;
--string 要寫入的字符串內(nèi)容,也可以是一個(gè)buffer
--position 數(shù)據(jù)要被寫入的位置;
--encoding 是期望的字符串編碼,默認(rèn)值: utf8;
--callback 回調(diào)會(huì)接收到參數(shù)(err, written, string)
written 指定傳入的字符串中寫入的字節(jié)數(shù)。
被寫入的字節(jié)數(shù)不一定與被寫入的字符串字符數(shù)相同
*/
fs.write(fd, 'How are you?', (err, written, str) => { // 向fd所指向的文件添加內(nèi)容
if (err) throw err; // 如果寫入失敗將拋出錯(cuò)誤
console.log(written); // 返回寫入的字符串的所占字節(jié)數(shù)(注意:1個(gè)漢字占3個(gè)字節(jié))
console.log(str); // 返回寫入的文件內(nèi)容
})
})
fs.closeSync(fd)同步關(guān)閉文件
fs.close(fd,callback)異步關(guān)閉文件,異步關(guān)閉存在回調(diào)函數(shù),內(nèi)部只有1異常參數(shù)err
const fs = require('fs');
fs.open('./test.txt', 'rs+', (err, fd) => {
if (err) {
console.log('文件打開失?。?);
return false;
}
fs.close(fd, err => {
if (err) throw err;
// 關(guān)閉文件的回調(diào)函數(shù)體
})
})
const fs = require('fs')
// data.isFile() 判斷是否為文件
// data.isDirectory()判斷是否為目錄
/*
fs.stat('./html', (err, data) => {
if (err) {
console.log(err);
return;
}
console.log(`是文件:${data.isFile()}`);
console.log(`是目錄:${data.isDirectory()}`);
})
*/
/*
fs.mkdir()傳遞的三個(gè)參數(shù)
path 將創(chuàng)建的目錄路徑
mode 目錄權(quán)限(讀寫權(quán)限),默認(rèn)777
callback 回調(diào),傳遞異常參數(shù)err
*/
/*
fs.mkdir('./css', (err, data) => {
if (err) {
console.log(err);
return;
}
console.log('創(chuàng)建成功');
})
*/
/*
// 寫入文件時(shí),如果文件存在就直接覆蓋,如果文件不存在就直接創(chuàng)建并寫入
/*
filename (String) 文件名稱
data (String | Buffer) 將要寫入的內(nèi)容,可以使字符串 或 buffer數(shù)據(jù)。
options (Object) option數(shù)組對象,包含:
· encoding (string) 可選值,默認(rèn) ‘utf8′,當(dāng)data使buffer時(shí),該值應(yīng)該為 ignored。
· mode (Number) 文件讀寫權(quán)限,默認(rèn)值 438
· flag (String) 默認(rèn)值 ‘w'
callback {Function} 回調(diào),傳遞一個(gè)異常參數(shù)err。
*/
fs.writeFile('./html/index.html', '你好Node.js', (err, data) => {
if (err) {
console.log(err);
return;
}
console.log('創(chuàng)建寫入文件成功');
})
*/
// 追加文件時(shí),如果文件存在就直接在文件后追加內(nèi)容,如果文件不存在就直接創(chuàng)建并寫入
/*
fs.appendFile('./css/style.css', 'h1{color:red}\n', (err) => {
if (err) {
console.log(err);
return;
}
console.log('appendFile成功');
})
*/
// 同步讀取文件
/*
let orders = fs.readFileSync('./html/index.html', 'utf-8');
console.log(orders);
*/
/*
fs.readFile(path[, options], callback)
options:
--encoding:編碼方式,默認(rèn)值: null;
--flag:文件系統(tǒng)flag 的支持。默認(rèn)值為‘r‘
callback:說明異步讀取文件的回調(diào)函數(shù),傳入兩個(gè)參數(shù)(err, data)
err:異常出錯(cuò)信息;
data:讀取文件內(nèi)容,若未指定字符編碼,返回原始buffer
*/
/*
fs.readFile('./html/index.html', 'utf-8', (err, data) => {
if (err) {
console.log(err);
return;
}
console.log(data);
console.log(data.toString()); // 將Buffer轉(zhuǎn)換為string類型 ,不加utf-8就需要加這一句
})
*/
/*
fs.readdir('./html', (err, data) => {
if (err) {
console.log(err);
return
}
console.log(data);
})
*/
// 重命名或移動(dòng)的功能
// 重命名
// fs.rename('./html/a.html', './html/b.html', (err, data) => {
// if (err) {
// console.log(err);
// return
// }
// console.log(data);
// })
// 移動(dòng)
/*
fs.rename('./html/b.html', './css/b.css', (err, data) => {
if (err) {
console.log(err);
return
}
console.log('移動(dòng)文件成功');
})
*/
// 刪除目錄,如果不加第二個(gè)參數(shù){recursive: true }只能刪除空目錄而不能刪除有文件的目錄
/*
fs.rmdir('./aaa', { recursive: true }, (err, data) => {
if (err) {
console.log(err);
return
}
console.log('刪除目錄成功');
})
*/
// 刪除文件
fs.unlink('./css/b.css', (err, data) => {
if (err) {
console.log(err);
return
}
console.log('刪除文件成功');
})
操作
檢查upload目錄是否存在,不存在就創(chuàng)建一個(gè)
const fs = require('fs')
let path = './upload'
fs.stat(path, (err, data) => {
if (err) {
console.log(err);
mkdir(path)
return
}
if (!data.isDirectory) {
fs.unlink(path, (err, data) => {
if (!err) {
mkdir(path)
} else {
console.log('檢查文件格式是否正確');
}
})
} else {
console.log('目錄已經(jīng)存在');
}
})
function mkdir(dir) {
fs.mkdir(dir, (err, data) => {
if (err) {
console.log(err);
return
}
})
}
對于文件的操作還可以使用三方庫mkdirp https://www.npmjs.com/package/mkdirp
var mkdirp = require('mkdirp');
mkdirp('./upload/aaa/xxxx', function (err) {
if (err) {
console.error(err);
}
});
在一個(gè)目錄中找出所有的目錄,并將目錄的名稱放入一個(gè)數(shù)組中
注意:fs里面的方法是異步
方法一,使用閉包的方式:
const fs = require('fs');
let path = '../wwwroot';
let dirArr = [];
fs.readdir(path,(err,data)=>{
if(err){
console.log(err);
return;
}
(function yy(i){
if(i === data.length){
console.log(dirArr);
return;
}
let pathName = path + '/' + data[i];
fs.stat(pathName,(err,ret)=>{
if(ret.isDirectory()){
dirArr.push(data[i])
}
yy(i+1)
})
})(0)
})
方法二:使用async和await
const fs = require('fs');
function isDirec(pathName){
return new Promise((resolve,reject)=>{
fs.stat(pathName,(err,ret)=>{
if(err){
console.log(err);
reject(err);
return;
}
if(ret.isDirectory()){
resolve(true)
}else{
resolve(false)
}
})
})
}
function main(){
let path = '../wwwroot';
let dirArr = [];
fs.readdir(path, async (err,data)=>{
if(err){
console.log(err);
return;
}
for(let i = 0; i < data.length; i++){
let pathName = path + '/' + data[i];
if(await isDirec(pathName)){
dirArr.push(data[i])
}
}
console.log(dirArr);
})
}
main()