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()一定要写,否则浏览器将会进入无限加载的假死状态。
  • 即使已经写了charset='utf-8'"但是仍然无法识别中文,需要像html一样在前面加个标签写上UTF-8,例如:
res.write('

你好this is nodejs

') //浣犲ソthis is nodejs
res.write(' ')
res.write('

你好this is nodejs

') //你好this is nodejs

1.url模块的使用

  • 获取用户传过来的参数
const url = require('url')

var api='http://www.itying.com?name=zhangsan&age=20'
console.log(url.parse(api,true)) //获取用户传过来的参数 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' }

实现自定义模块化:
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(" ")
  var api = tools.formatApi("api/plist")
  response.write(api) //http://www.loveitying.com/api/plist
  response.end();
}).listen(8081);

nodejs默认会找node_modules对应模块里面的index.js

2.包与NPM

Nodejs中除了它自己提供的核心模块外,我们可以自定义模块,也可以使用第三方的模块。Nodejs 中第三方模块组成,可以通过来对一组具有相互依赖关系的模块进行统一管理。

npm是世界上最大的开放源代码的生态系统。我们可以通过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 [email protected] --save
  • package.json中“dependencies”里面是需要安装的包及包的信息,可用npm i下载

3.fs模块

  • fs.stat 检测是文件还是目录
const fs = require('fs')
// fs.stat('路径',回调函数)
fs.stat('./html',(err,data) => {
  if(err) {
    console.log(err)
    return
  }
  console.log(`是文件:${data.isFile()}`) //是文件:false
  console.log(`是目录:${data.isDirectory()}`) //是目录:true
})
  • fs.mkdir 创建目录
const fs = require('fs')
// fs.mkdir('将要创建的目录路径',目录权限(可不写,默认777),回调函数)
fs.mkdir('./css',(err) => {
  if(err) {
    console.log(err)
    return
  }
  console.log('创建成功') //创建成功
})
  • fs.writeFile 创建写入文件
const fs = require('fs')
// 如果没有该文件则创建该文件,如果已经有此文件则作替换操作,即再次运行时把输入内容写成‘嘻嘻’文件中内容会变成‘嘻嘻’而不是‘你好nodejs嘻嘻’
fs.writeFile('./css/index.html','你好nodejs',(err) => {
  if(err) {
    console.log(err)
    return
  }
  console.log('创建写入文件成功') //创建写入文件成功
})
  • fs.appendFile 追加文件
const fs = require('fs')
// 如果没有该文件则创建该文件,如果已经有此文件则追加内容,由上个例子再次运行时把输入内容写成‘嘻嘻’文件中内容会变成‘你好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类型
  console.log(data.toString()) //你好nodejs嘻嘻
  //将Buffer转化成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 目录中还有其它文件,无法删除,当该目录中没有文件时即可删除成功
    return
  }
  console.log('删除目录成功') 
})
  • fs.unlink 别除文件
fs.unlink('./css/font.html',(err) => {
  if(err) {
    console.log(err)
    return
  }
  console.log('删除文件成功') //移动文件成功
})

4.fs模块例子

  • 判断服务器上面有没有upload目录。如果没有创建这个目录,如果有的话不做操作。
//方法一
const fs = require('fs')

let path = './upload'
fs.stat(path,(err,data) => {
  if(err) {
    mkdir(path)
    return
  }
  if(!data.isDirectory()) {
    //若有同名文件会报错,所以要首先删除文件再去执行创建目录
    fs.unlink(path,(err) => {
      if(!err) {
        mkdir(path)
      } else {
        console.log('请检查传入的数据是否正确')
      }
    })
  }
})

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到数组中
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从文件流中读取数据

//读取流
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('写入完成')
})

//管道流(复制文件
const fs = require('fs')

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

readStream.pipe(writeStream)

你可能感兴趣的:(Nodejs中fs模块的使用)