Nodejs中fs模塊的使用

nodejs

const http = require('http')
http.createServer((req,res) => {
  console.log(req.url)

  res.writeHead(200,{"Content-type":"text/html;charset='utf-8'"})
  res.write('this is nodejs')
  res.end()
}).listen(3000)
  • res.end()一定要寫,否則瀏覽器將會進入無限加載的假死狀態(tài)禁添。
  • 即使已經(jīng)寫了charset='utf-8'"但是仍然無法識別中文撮胧,需要像html一樣在前面加個<meta>標簽寫上UTF-8,例如:
res.write('<h2>你好this is nodejs</h2>') //浣犲ソthis is nodejs
res.write('<head> <meta charset="UTF-8"></head>')
res.write('<h2>你好this is nodejs</h2>') //你好this is nodejs

1.url模塊的使用

  • 獲取用戶傳過來的參數(shù)
const url = require('url')

var api='http://www.itying.com?name=zhangsan&age=20'
console.log(url.parse(api,true)) //獲取用戶傳過來的參數(shù) query: [Object: null prototype] { name: 'zhangsan', age: '20' }

var temp = url.parse(api,true).query

console.log(temp) //[Object: null prototype] { name: 'zhangsan', age: '20' }

實現(xiàn)自定義模塊化:
1.我們可以把公共的功能抽離成為一個單獨的js 文件作為一個模塊,默認情況下面這個模塊里面的方法或者屬性老翘,外面是沒法訪問的芹啥。如果要讓外部可以訪問模塊里面的方法或者屬性,就必須在模塊里面通過exports或者module.exports 暴露屬性或者方法铺峭。
2.在需要使用這些模塊的文件中墓怀,通過 require的方式引入這個模塊。這個時候就可以使用模塊里面暴露的屬性和方法卫键。

myTry1.js文件:

function formatApi(api) {
 return 'http://www.love.com/' + api
}
//兩種暴露方式
exports.formatApi = formatApi
module.exports = formatApi;

myTry.js文件:

const http = require('http')
//兩種引入的方法
const tools = require('./myTry1') //1.
const toos = require('./myTry1') //2.
console.log(tools) //{ formatApi: [Function: formatApi] }
http.createServer(function (request, response) {
  response.writeHead(200, {'Content-Type': 'text/html;charset="utf-8"'});
  response.write("<head> <meta charset='UTF-8'></head>")
  var api = tools.formatApi("api/plist")
  response.write(api) //http://www.loveitying.com/api/plist
  response.end();
}).listen(8081);

nodejs默認會找node_modules對應(yīng)模塊里面的index.js

2.包與NPM

Nodejs中除了它自己提供的核心模塊外傀履,我們可以自定義模塊,也可以使用第三方的模塊莉炉。Nodejs 中第三方模塊組成钓账,可以通過來對一組具有相互依賴關(guān)系的模塊進行統(tǒng)一管理。

npm是世界上最大的開放源代碼的生態(tài)系統(tǒng)絮宁。我們可以通過npm下載各種各樣的包官扣,這些源代碼(包)我們可以在https://www.npmjs.com找到。

  • 在項目的跟目錄下使用命令提示符輸入npm init --yes來下載package.json文件
  • 加密處理例子:npm install md5 --save
var md5 = require('md5')
md5('123456')
console.log(md5('123456')) //e10adc3949ba59abbe56e057f20f883e
  • 指定包的版本:npm install node-media-server@2.1.0 --save
  • package.json中“dependencies”里面是需要安裝的包及包的信息羞福,可用npm i下載

3.fs模塊

  • fs.stat 檢測是文件還是目錄
const fs = require('fs')
// fs.stat('路徑',回調(diào)函數(shù))
fs.stat('./html',(err,data) => {
  if(err) {
    console.log(err)
    return
  }
  console.log(`是文件:${data.isFile()}`) //是文件:false
  console.log(`是目錄:${data.isDirectory()}`) //是目錄:true
})
  • fs.mkdir 創(chuàng)建目錄
const fs = require('fs')
// fs.mkdir('將要創(chuàng)建的目錄路徑',目錄權(quán)限(可不寫,默認777)蚯涮,回調(diào)函數(shù))
fs.mkdir('./css',(err) => {
  if(err) {
    console.log(err)
    return
  }
  console.log('創(chuàng)建成功') //創(chuàng)建成功
})
  • fs.writeFile 創(chuàng)建寫入文件
const fs = require('fs')
// 如果沒有該文件則創(chuàng)建該文件治专,如果已經(jīng)有此文件則作替換操作,即再次運行時把輸入內(nèi)容寫成‘嘻嘻’文件中內(nèi)容會變成‘嘻嘻’而不是‘你好nodejs嘻嘻’
fs.writeFile('./css/index.html','你好nodejs',(err) => {
  if(err) {
    console.log(err)
    return
  }
  console.log('創(chuàng)建寫入文件成功') //創(chuàng)建寫入文件成功
})
  • fs.appendFile 追加文件
const fs = require('fs')
// 如果沒有該文件則創(chuàng)建該文件遭顶,如果已經(jīng)有此文件則追加內(nèi)容张峰,由上個例子再次運行時把輸入內(nèi)容寫成‘嘻嘻’文件中內(nèi)容會變成‘你好nodejs嘻嘻’
fs.appendFile('./css/index.html','嘻嘻',(err) => {
  if(err) {
    console.log(err)
    return
  }
  console.log('追加文件成功') //追加文件成功
})
  • fs.readFile 讀取文件
const fs = require('fs')
fs.readFile('./css/index.html',(err,data) => {
  if(err) {
    console.log(err)
    return
  }
  console.log(data) //<Buffer e4 bd a0 e5 a5 bd 6e 6f 64 65 6a 73 e5 98 bb e5 98 bb> 
  //十六進制的buffer類型
  console.log(data.toString()) //你好nodejs嘻嘻
  //將Buffer轉(zhuǎn)化成string類型
})
  • fs.readdir 讀取目錄
const fs = require('fs')
fs.readdir('./css',(err,data) => {
  if(err) {
    console.log(err)
    return
  }
  console.log(data) //[ 'font.html', 'index.html' ]
})
  • fs.rename 重命名
const fs = require('fs')
// fs.rename(oldRoad,newRoad,callback) 功能:1.重命名 2.移動文件(可邊重命名邊移動)
//重命名
fs.rename('./css/index.html','./css/html.html',(err) => {
  if(err) {
    console.log(err)
    return
  }
  console.log('重命名成功') //重命名成功
})
//移動文件
fs.rename('./css/html.html','./UIbutton/html.html',(err) => {
  if(err) {
    console.log(err)
    return
  }
  console.log('移動文件成功') //移動文件成功
})
  • fs.rmdir 刪除目錄
const fs = require('fs')
// fs.rename(oldRoad,newRoad,callback) 功能:1.重命名 2.移動文件
fs.rmdir('./css',(err) => {
  if(err) {
    console.log(err) //Error: ENOTEMPTY: directory not empty 目錄中還有其它文件,無法刪除棒旗,當(dāng)該目錄中沒有文件時即可刪除成功
    return
  }
  console.log('刪除目錄成功') 
})
  • fs.unlink 別除文件
fs.unlink('./css/font.html',(err) => {
  if(err) {
    console.log(err)
    return
  }
  console.log('刪除文件成功') //移動文件成功
})

4.fs模塊例子

  • 判斷服務(wù)器上面有沒有upload目錄喘批。如果沒有創(chuàng)建這個目錄,如果有的話不做操作铣揉。
//方法一
const fs = require('fs')

let path = './upload'
fs.stat(path,(err,data) => {
  if(err) {
    mkdir(path)
    return
  }
  if(!data.isDirectory()) {
    //若有同名文件會報錯饶深,所以要首先刪除文件再去執(zhí)行創(chuàng)建目錄
    fs.unlink(path,(err) => {
      if(!err) {
        mkdir(path)
      } else {
        console.log('請檢查傳入的數(shù)據(jù)是否正確')
      }
    })
  }
})

function mkdir(dir) {
  fs.mkdir(dir,(err) => {
    if(err) {
      console.log(err)
      return
    }
  })
}

//方法二
//cnpm i mkdirp --asve
var mkdirp = require('mkdirp')
mkdirp('./upload',function(err) {
  if(err) {
    console.error(err)
  }
})
mkdirp('./upload')
//可生成多個目錄
mkdirp('./upload/aaa/xxx',function(err) {
  if(err) {
    console.error(err)
  }
})
  • wwwroot文件夾下面有images css js以及index.html , 找出wwwroot目錄下面的所有的目錄,并將目錄push到數(shù)組中
const fs = require('fs')
//方法一
let dirArr = []
let path = './wwwroot'
fs.readdir(path,(err,data) => {
  if(err) {
    console.log(err)
    return
  }
  //注意:fs.stat是異步方法逛拱,所以以下是錯誤方法
  // for(let i = 0;i < data.length;i++) {
  //   fs.stat(path + '/' + data[i],(error,stats) => {
  //     if(stats.isDirectory()) {
  //       dirArr.push(data[i])
  //     }
  //   })
  // }
  (function getDir(i) {
    if(i == data.length) {
      console.log(dirArr) //[ 'css', 'img', 'js' ]
      return
    }
    fs.stat(path + '/' + data[i],(error,stats) => {
      if(stats.isDirectory()) {
        dirArr.push(data[i])
      }
      getDir(i + 1)
    })
  })(0)

})

//方法二
  async function isDir(path) {
    return new Promise((resolve,reject) => {
      fs.stat(path,(error,stats) => {
        if(error) {
          console.log(error)
          return
        }

        if(stats.isDirectory()) {
          resolve(true)
        } else {
          reject(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++) {
      if(await isDir(path + '/' + data[i])) {
        dirArr.push(data[i])
      }
    }
    console.log(dirArr)
  })
}
main()

5. fs.createReadStream從文件流中讀取數(shù)據(jù)

//讀取流
const fs = require('fs')

let readStream = fs.createReadStream('./xxx.txt')
var count = 0
var str = ''

readStream.on('data',(data) => {
  str += data
  count++
})
readStream.on('end',() => {
  console.log(str)
  console.log(count)
})
readStream.on('error',(err) => {
  console.log(err)
})


//寫入流
const fs = require('fs')

var str = ''

for(var i = 0;i < 500;i++) {
  str += 'lalala\n'
}

var writeStream = fs.createWriteStream('./xxx.txt')

writeStream.write(str)

// 標記寫入完成
writeStream.end()
writeStream.on('finish',() => {
  console.log('寫入完成')
})

//管道流(復(fù)制文件
const fs = require('fs')

var readStream = fs.createReadStream('./aaa/QQ.png')
var writeStream = fs.createWriteStream('./bbb/QQ.png')

readStream.pipe(writeStream)
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末敌厘,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子朽合,更是在濱河造成了極大的恐慌俱两,老刑警劉巖饱狂,帶你破解...
    沈念sama閱讀 211,265評論 6 490
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異宪彩,居然都是意外死亡休讳,警方通過查閱死者的電腦和手機,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 90,078評論 2 385
  • 文/潘曉璐 我一進店門尿孔,熙熙樓的掌柜王于貴愁眉苦臉地迎上來俊柔,“玉大人,你說我怎么就攤上這事纳猫∑畔蹋” “怎么了?”我有些...
    開封第一講書人閱讀 156,852評論 0 347
  • 文/不壞的土叔 我叫張陵芜辕,是天一觀的道長尚骄。 經(jīng)常有香客問我,道長侵续,這世上最難降的妖魔是什么倔丈? 我笑而不...
    開封第一講書人閱讀 56,408評論 1 283
  • 正文 為了忘掉前任,我火速辦了婚禮状蜗,結(jié)果婚禮上需五,老公的妹妹穿的比我還像新娘。我一直安慰自己轧坎,他們只是感情好宏邮,可當(dāng)我...
    茶點故事閱讀 65,445評論 5 384
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著缸血,像睡著了一般蜜氨。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上捎泻,一...
    開封第一講書人閱讀 49,772評論 1 290
  • 那天飒炎,我揣著相機與錄音,去河邊找鬼笆豁。 笑死郎汪,一個胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的闯狱。 我是一名探鬼主播煞赢,決...
    沈念sama閱讀 38,921評論 3 406
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼扩氢!你這毒婦竟也來了耕驰?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 37,688評論 0 266
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎朦肘,沒想到半個月后饭弓,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 44,130評論 1 303
  • 正文 獨居荒郊野嶺守林人離奇死亡媒抠,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 36,467評論 2 325
  • 正文 我和宋清朗相戀三年弟断,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片趴生。...
    茶點故事閱讀 38,617評論 1 340
  • 序言:一個原本活蹦亂跳的男人離奇死亡阀趴,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出苍匆,到底是詐尸還是另有隱情刘急,我是刑警寧澤,帶...
    沈念sama閱讀 34,276評論 4 329
  • 正文 年R本政府宣布浸踩,位于F島的核電站叔汁,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏检碗。R本人自食惡果不足惜据块,卻給世界環(huán)境...
    茶點故事閱讀 39,882評論 3 312
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望折剃。 院中可真熱鬧另假,春花似錦、人聲如沸怕犁。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,740評論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽奏甫。三九已至苟耻,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間扶檐,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 31,967評論 1 265
  • 我被黑心中介騙來泰國打工胁艰, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留款筑,地道東北人。 一個月前我還...
    沈念sama閱讀 46,315評論 2 360
  • 正文 我出身青樓腾么,卻偏偏與公主長得像奈梳,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子解虱,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 43,486評論 2 348

推薦閱讀更多精彩內(nèi)容