nodejsのファイルシステム


概要
nodejsは、非同期IOを使用して、サービスの処理効率を向上させます.IOの中で重要なのはファイルIOです.今日は、nodejsのファイルシステムとIO操作について詳しく紹介します.
nodejsのファイルシステムモジュール
nodejsにはfsという非常に重要なモジュールがあります.このモジュールは多くの非常に実用的な関数を提供して、ファイルシステムにアクセスし、ファイルシステムと相互作用する.
簡単な統計では、fsは以下のような多様なファイル操作方法を提供しています.
  • fs.access():ファイルが存在するかどうかを確認し、Node.jsにアクセスする権限があるかを確認します.
  • fs.apendFile():データをファイルに追加します.ファイルが存在しない場合は、ファイルを作成します.
  • fs.chmod():ファイル(着信ファイル名で指定)の権限を変更します.関連方法:fs.lchmod()、fs.fchmod().
  • fs.chown():ファイルの所有者とグループを変更する.関連方法:fs.fchown()、fs.lchown().
  • fs.close():ファイルディスクリプタを閉じます.
  • fs.co pyFile():ファイルをコピーします.
  • fs.reat ReadStream():読み取り可能なファイルストリームを作成する.
  • fs.reat WriteStream():書き込み可能なファイルストリームを作成します.
  • fs.link():ファイルへのハードリンクを新規作成します.
  • fs.mkdir():新規フォルダを作成します.
  • fs.mkdtemp():一時ディレクトリを作成します.
  • fs.open():ファイルモードを設定します.
  • fs.readdir():ディレクトリの内容を読み出す.
  • fs.readFile():ファイルの内容を読み取る.関連方法:fs.read().
  • fs.readlink():シンボルリンクの値を読み出す.
  • fs.realpath():相対的なファイルパスポインタ(.,.)を完全なパスとして解析します.
  • fs.rename():ファイルまたはフォルダの名前を変更します.
  • fs.rmdir():フォルダを削除します.
  • fs.stat():ファイル(着信ファイル名で指定)の状態に戻る.関連方法:fs.fstat()、fs.lstat().
  • fs.symlink():新規ファイルのシンボリックリンク.
  • fs.truncate():転送されたファイル名の識別されたファイルを指定の長さにカットします.関連方法:fs.fftruncate().
  • fs.unlink():ファイルまたはシンボリックリンクを削除します.
  • fs.unwatFile():監視ファイル上の変更を停止します.
  • fs.utimes():ファイルのタイムスタンプを変更します.関連方法:fs.futimes()
  • fs.watFile():ファイル上の変更の監視を開始します.関連方法:fs.watch().
  • fs.writeFile():データをファイルに書き込みます.関連方法:fs.write().
  • 上記fsが提供する方法はすべて非同期であり、非同期という意味は、これらの方法はすべてコールバック関数を提供し、非同期が対応する処理ロジックをトリガするのに便利である.
    ファイルを簡単に読み込む例を挙げます.
    const fs = require('fs')
    
    fs.readFile('/tmp/flydean.txt', 'utf8' , (err, data) => {
      if (err) {
        console.error(err)
        return
      }
      console.log(data)
    })
    上記の例では、flydean.txtファイルを/tmpファイルから読みました.異常と正常のデータはそれぞれcalback関数で処理しました.
    fsは非同期的な方法を提供すると同時に、同期的な方法の呼び出しも提供しています.この同期の方法は非同期的な方法の後にSyncを加えることです.
    const fs = require('fs')
    
    try {
      const data = fs.readFileSync('/tmp/flydean.txt', 'utf8')
      console.log(data)
    } catch (err) {
      console.error(err)
    }
    上の方法を同期方法に書き換えた後の様子を見てください.
    両者の違いは、同期方法がブロックされ、file読み取りが完了するまで待つということです.
    Promiseバージョンのfs
    非同期の操作はPromsieより少ないです.fsの操作は全部非同期ですから、calbackを使ってfsを使いたくないなら、fsもPromiseバージョンを提供します.
    まだ先のreadfileの例です.Promiseを使うなら、どうすればいいですか?
    const fs = require('fs/promises');
    
    (async function(path) {
      try {
        await fs.readFile(path, 'utf8' );
        console.log(`       ${path}`);
      } catch (error) {
        console.error('  :', error.message);
      }
    })('/tmp/flydean.txt');
    fsのpromiseバージョンはfs/promisesの下にあります.上記の例ではasyncとawaitを使って同期方式で非同期プログラムを作成しています.とても便利です.
    ファイル記述子
    ファイル記述子とは、nodejsにおいて、fs.open方法を用いて得られたこの戻り値のことです.
    私たちはこのファイル記述子によって、ファイルとの相互作用を向上させることができます.
    const fs = require('fs')
    
    fs.open('/tmp/flydean.txt', 'r', (err, fd) => {
      //fd       。
    })
    上記のopenメソッドの2番目のパラメータは読み取り専用でファイルを開きます.
    私たちはよく使うファイルシステムのロゴを見ます.
  • 'r':ファイルを開いて読み取りに使います.ファイルが存在しないと異常が発生します.
  • 'r+':ファイルを開いて読み込みと書き込みに使います.ファイルが存在しないと異常が発生します.
  • 'w':書き込みのためにファイルを開く.ファイルが存在しない場合はファイルを作成し、ファイルが存在する場合はファイルを切断します.
  • 'w+':ファイルを開いて読み込みと書き込みに使います.ファイルが存在しない場合はファイルを作成し、ファイルが存在する場合はファイルを切断します.
  • 'a':ファイルを開いて、追加のために使います.ファイルが存在しない場合は、このファイルを作成します.
  • 'a+':ファイルを開いて読み込みと追加のために使います.ファイルが存在しない場合は、このファイルを作成します.
  • もちろん、上記の例もopenSyncで書き換えられます.
    const fs = require('fs')
    
    try {
      const fd = fs.openSync('/tmp/flydean.txt', 'r')
    } catch (err) {
      console.error(err)
    }
    fs.statファイル状態情報
    nodejsは、ファイルの状態情報を記述するためのfs.Sttsクラスを提供する.
    Sttsはファイルの状態を判断するために非常に有用な方法を提供する.
    例えば、stats.isDirectory()、stats.isfile()、stats.issocket()、stats.isSymboricLink()、stats.ctimeなどです.
    スターはまた、ファイルの時間に関するオプションを提供しています.
  • atime「アクセス時間」-前回ファイルデータにアクセスした時間.
  • mtime「変更時間」-前回のファイルデータの変更時間.
  • ctime「変更時間」→前回のファイル状態変更(インデックスノードデータの変更)の時間.
  • bithttime「作成時間」-ファイル作成時間.
  • どうやってfs.statを取得しますか?
    const fs = require('fs')
    fs.stat('/tmp/flydean.txt', (err, stats) => {
      if (err) {
        console.error(err)
        return
      }
    
      stats.isFile() //true
      stats.isDirectory() //false
      stats.isSymbolicLink() //false
      stats.size //    
    })
    fs.Sttsはfs.statのコールバック関数パラメータとして伝えられます.fs.Sttsを通じて、一連の操作を行います.
    fsのファイル読み書き
    上記ではfsを使ったファイルの読み込み操作を紹介しましたが、どのようにfsを使ってファイルの書き込みを行うかを紹介します.
    const fs = require('fs')
    
    const content = 'www.flydean.com'
    
    fs.writeFile('/tmp/flydean.txt', content, err => {
      if (err) {
        console.error(err)
        return
      }
      //      。
    })
    上はcalbackのバージョンです.同期バージョンをもう一つ見ます.
    const fs = require('fs')
    
    const content = 'www.flydean.com'
    
    try {
      const data = fs.writeFileSync('/tmp/flydean.txt', content)
      //      。
    } catch (err) {
      console.error(err)
    }
    writeFileはまた、追加のoptionsパラメータをサポートしています.optionsパラメータでは、r+,w+,a,a+などのファイル書き込みフラグビットを指定できます.
    fs.writeFile('/tmp/flydean.txt', content, { flag: 'a+' }, err => {})
    もちろん、a+を使用してファイルの末尾にappedを表示する以外に、fsはファイルの末尾に出力するためのapped File方法を提供しています.
    const fs = require('fs')
    
    const content = 'www.flydean.com'
    
    fs.appendFile('/tmp/flydean.txt', content, err => {
      if (err) {
        console.error(err)
        return
      }
      //  append  。
    })
    fsのフォルダ操作
    ファイルがあるとフォルダがあります.fsは一連のフォルダ操作を提供します.
    mkdir,readdir,rename rmdir操作.
    readdirの相対的な責任点を例に挙げて説明します.
    const fs = require('fs')
    const folderPath = '/tmp'
    
    fs.readdir(folderPath, function(err,files){
        if(err){
            console.log(err);
        }
        files.map(file => console.log(file));
    })
    
    fs.readdirSync(folderPath).map(fileName => {
        console.log(fileName);
    })
    上記の例では、私たちはそれぞれreaddirとreaddirSyncの2つの方式を使用してディレクトリのファイルを読みます.
    その違いを見てもいいです.
    パス操作
    最後に、ファイルとディレクトリを処理するためのいくつかの実用的なツールを提供するfileと特別に関連するパス操作を紹介します.
    パスはパスを表します.私たちは次のようにパスを使います.
    const path = require('path')
    なぜパスが必要ですか?私たちはこの世界には大体二つのタイプのオペレーティングシステム、ウィンドウズとPOSIXがあると知っています.
    この2つのオペレーティングシステムでは、経路の表現が異なる.したがって、私たちは共通のパスモジュールが必要です.この違いを解決してくれます.
    この違いは一例で観察できます.
    windowsで:
    path.basename('C:\\temp\\myfile.html');
    //   : 'myfile.html'
    POSIX上で:
    path.basename('C:\\temp\\myfile.html');
    //   : 'C:\\temp\\myfile.html'
    まず、path.basenameという方法を見てみます.pathの最後の部分を返すためです.
    上記の例では、windowsにwindowsスタイルのパスが入ってきましたので、正常に解析できます.正常な結果が得られます.
    POSIX環境の中で、私達はwindowsスタイルのパスを伝えました.正常に解析できなくて、直接全体の結果に戻ります.
    パスには多くの非常に有用な方法があります.
    const notes = '/tmp/notes.txt'
    
    path.dirname(notes) // /tmp
    path.basename(notes) // notes.txt
    path.extname(notes) // .txt
    
    path.join('/', 'tmp', 'notes.txt') //'/tmp/notes.txt'
    
    path.resolve('notes.txt') //'/Users/flydean/notes.txt'          ,           
    
    path.normalize('/tmp/flydean..//test.txt') ///tmp/test.txt           
    本文の作者:flydeanプログラムのあれらの事
    本論文のリンク:http://www.flydean.com/nodejs-file-system/
    flydeanのブログ
    私の公衆番号に注目してください.「プログラムに関すること」を最も分かりやすく解読し、最も深い商品、最も簡潔な教程、多くのあなたの知らない小さな技術などを発見してください.