Node.jsにおけるファイルシステムfsモジュールの使用及び常用インターフェース



fsはFilesystemの略語で、このモジュールはローカルファイルの読み書き能力を提供します。基本的にPOSIXファイル操作コマンドの簡単な包装です。しかし、このモジュールはほとんどすべての動作に非同期と同期の2つの動作方式を提供し、開発者に選択されます。
JavaScriptのはファイルを操作する能力がないので、Nodeはできます。Nodeはファイルシステムモジュールを提供しています。Nodeの中で非常に重要で高周波のモジュールを使用しています。絶対にマスターしたいモジュールシステムです。
fsモジュールは非常に多くのインターフェースを提供しています。ここでは主にいくつかの一般的なインターフェースについて説明します。
1.よく使うAPIの快速復習
fs.stat検出はファイルですか?それともディレクトリですか?

const fs = require('fs')
fs.stat('hello.js', (error,stats)=>{
 if(error) {
 console.log(error)
 } else {
 console.log(stats)
 console.log(`  :${stats.isFile()}`)
 console.log(`  :${stats.isDirectory()}`)
 }
})
fs.mkdir作成ディレクトリ

const fs = require('fs')
fs.mkdir('logs', error => {
 if(error) {
 console.log(error)
 } else {
 console.log('      !')
 }
})
fs.rmdirディレクトリを削除します。

const fs = require('fs')
fs.rmdir('logs', error => {
 if(error) {
 console.log(error)
 } else {
 console.log('        logs')
 }
})
fs.writeFileが書き込みファイルを作成します。

const fs = require('fs')
fs.writeFile('logs/hello.log','  ~
', error => { if(error) { console.log(error) } else { console.log(' '); } })
fs.apendFile追加ファイル

const fs = require('fs')
fs.appendFile('logs/hello.log','hello~
', error => { if(error) { console.log(error) } else { console.log(' '); } })
fs.readFileがファイルを読み込みます。

const fs = require('fs')
fs.readFile('logs/hello.log','utf-8', (error, data) => {
 if(error) {
 console.log(error)
 } else {
 console.log(data);
 }
})
fs.unlink削除ファイル

const fs = require('fs')
fs.unlink(`logs/${file}`, error => {
 if(error) {
 console.log(error)
 } else {
 console.log(`       : ${file}`)
 }
})
fs.readdirがディレクトリを読み込みます。

const fs = require('fs')
fs.readdir('logs', (error, files) => {
 if(error) {
 console.log(error)
 } else {
 console.log(files);
 }
})
fs.renameの名前を変更したり、ファイルの保存経路を変更することができます。

const fs = require('fs')
fs.rename('js/hello.log', 'js/greeting.log', error => {
 if(error) {
 console.log(error)
 } else {
 console.log('     ')
 }
})
2.第三者NPMパッケージmkdirpの使用
mkdir pはフォルダを作成するだけでなく、複数のフォルダを作成することもできます。mkdir-pコマンドのようです。midir -p tmp/foo/bar/baz上記のコマンドは、現在のディレクトリに複数のフォルダを作成することもできます。
下記のコードにより、現在のディレクトリに階層フォルダを生成します。

const mkdirp = require('mkdirp')
mkdirp('tmp/foo/bar/baz').then(made => console.log(`     : ${made}`))
//      : /Users/zhangbing/github/CodeTest/Node/fs/tmp
結果

3.実戦例
実戦である
サーバーの上にアップロードディレクトリがあるかどうかを判断します。なければこのディレクトリを作成します。もしあれば操作しません。

const fs = require('fs')

const path = './upload'
fs.stat(path, (err, data) => {
 if(err) {
 //       
 mkdir(path)
 return
 }
 if(data.isDirectory()) {
 console.log('upload    ');
 }else{
 //       ,        
 fs.unlink(path, err => {
  if(!err) {
  mkdir(path)
  }
 })
 }
})

function mkdir(dir) {
 fs.mkdir(dir, err => {
 if(err) {
  console.log(err);
  return
 }
 })
}
実戦2
wwww rootフォルダの下にimags css jsとindexがあります。wrootディレクトリの下にあるすべてのディレクトリを探して一つの配列に入れます。
同期方法を使う

const fs = require('fs')
const path = './wwwroot'
const dirArr = []

const dirs = fs.readdirSync(path)
dirs.forEach(item => {
 if(fs.statSync(path + '/' + item).isDirectory()) {
 dirArr.push(item)
 }
})
console.log('dirArr', dirArr)
// dirArr [ 'css', 'images', 'js' ]
async/await方式を使う

const fs = require('fs')
const path = './wwwroot'
const dirArr = []

function isDir(path) {
 return new Promise((resolve, reject) => {
 fs.stat(path, (error, stats) => {
  if(error) {
  console.log(error)
  reject(error)
  return
  }
  if(stats.isDirectory()) {
  resolve(true)
  } else {
  resolve(false)
  }
 })
 })
}

function main(){
 fs.readdir(path, async (error, data) => {
 if(error) {
  console.log(error)
  return
 } else {
  for(let i = 0; i < data.length; i++) {
  if(await isDir(path + '/' + data[i])) {
   dirArr.push(data[i])
  }
  }
  console.log('dirArr', dirArr)
 }
 })
}

main() // dirArr [ 'css', 'images', 'js' ]
4.パイプの流れ
パイプは入力ストリームへの出力流の機構を提供する。一般的に、1つのストリームからデータを取得し、他のストリームにデータを転送するために使用される。以下の例では、ファイルの内容を読み取り、他のファイルに内容を書き込みます。

const fs = require("fs")
//       
const readerStream = fs.createReadStream('input.txt')
//       
const writerStream = fs.createWriteStream('output.txt')
//      
//  input.txt    ,       output.txt   
readerStream.pipe(writerStream)
console.log("      ")
fs.createReadStream          
const fs = require('fs')
const fileReadStream = fs.fileReadStream('demo1.js')
let count = 0
let str = ''
fileReadStream.on('data', chunk => {
 console.log(`${++count}   :${chunk.length}`)
 str += chunk
})
fileReadStream.on('end', () => {
 console.log('---  ---')
 console.log(count + ',' + star)
})
fileReadStream.on('error', error => {
 console.log(error)
})
fs.createWriteStream     
const fs = require("fs")
const data ='           ,      '
//          ,     output.txt 
const writerStream = fs.createWriteStream('output.txt')
//  utf8      
writerStream.write(data,'UTF8')
//      
writerStream.end()
//     -->finish  
writerStream.on('finish', () => {
 /*finish-                。*/
 console.log("    。")
})
writerStream.on('error', err => {
 console.log(err.stack);
})
console.log("      ")
実戦:コピー画像はプロジェクトのルートディレクトリに画像2020.pngがあり、それを/wroot/imagsにコピーします。

コードは以下の通りです

const fs = require("fs")

const readStream = fs.createReadStream('./2020.png')
const writeStream = fs.createWriteStream('./wwwroot/images/2021.png')

readStream.pipe(writeStream)

特に注意したいのは、fs.reate WriteStreamに書き込むディレクトリは必ずコピーするファイル名を付けなければなりません。つまり、fs.create WriteStream('./wroot/imags/')と書いてはいけません。macOSでは以下のエラーが報告されます。
Error:ESDIR:illegal operation on a directory、open
本論文のソースコード:https://github.com/dunizb/CodeTest/tree/master/Node/fs
締め括りをつける
ここで、Node.js中fsモジュールの使用及び常用インターフェースに関する記事を紹介します。node.js fsモジュールの内容については、以前の文章を検索したり、下記の関連記事を見たりしてください。これからもよろしくお願いします。