パス操作(path)とファイル操作(fs)

pathモジュールを利用したパス操作方法、fsモジュールを利用したファイル操作方法(読み込み、書き込み、削除など)について動作確認します。

path|パス操作

以下フォルダ構成で動作確認します。

.
├── documentsA
│   ├── documentsB
│   │   └── text.txt
│   └── test.txt
├── documentsC
│   └── test.txt
└── path.js

パス情報を取得

パスが指すファイルの ディレクトリ 拡張子 などの情報を取得してみます。

path.js に以下処理を記述します。

const path = require('path');

console.log('---- basename ----');
console.log(path.basename('./documentsA/test.txt'));

console.log('---- dirname ----');
console.log(path.dirname('./documentsA/test.txt'));

console.log('---- extname ----');
console.log(path.extname('./documentsA/test.txt'));

console.log('---- parse ----');
console.log(path.parse('./documentsA/test.txt'));
$ node path.js 
---- basename ----
test.txt
---- dirname ----
./documentsA
---- extname ----
.txt
---- parse ----
{ root: '',
  dir: './documentsA',
  base: 'test.txt',
  ext: '.txt',
  name: 'test' }

パス結合

path.js に以下処理を記述します。

const path = require('path');

console.log(path.join('/xxx', 'yyy', 'aaa/bbb'));
$ node path.js 
/xxx/yyy/aaa/bbb

ディレクトリ間の相対パスを取得

第1引数のディレクトリ から 第2引数のディレクトリ への 相対パス を取得してみます。

path.js に以下処理を記述します。

const path = require('path');

console.log(path.relative('./documentsA', './documentsA/documentsB'));
console.log(path.relative('./documentsA/documentsB', './documentsC'));
console.log(path.relative('./documentsA', './documentsC'));
console.log(path.relative('./documentsA', '.'));
$ node path.js 
documentsB
../../documentsC
../documentsC
..

fs|ファイル操作

同期形式と非同期形式

以下のように、fsモジュール のメソッドには 同期形式非同期形式 が用意されています。

同期形式 非同期形式
statSync stat
copyFileSync copyFile
readFileSync readFile
unlinkSync unlink
  • 同期形式
    • 処理が完了するまでプロセス全体が待機状態になる
  • 非同期形式
    • 処理の完了を待たずに次の処理に進める

非同期処理 を利用すると性能面でメリットがあります。なので、処理内容的に 非同期処理 でも問題なければ、非同期処理を選ぶと良いです。

同期形式の場合の実装

try 〜 catch でエラーハンドリングします。

const fs = require('fs')

try {
  fs.statSync('documentsA/test1.txt')
  console.log('successfully')
} catch (err) {
  console.log(err)
}

非同期形式の場合の実装

最後の引数で コールバック を指定します。

const fs = require('fs')

fs.stat('documentsA/test1.txt', (err) => {
  if (err) throw err
  console.log('successfully')
})

ファイルの存在確認
( statSync, stat )

ファイルが存在すれば、fs.Statsオブジェクトを返します。

const fs = require('fs')

try {
  const statsA = fs.statSync('documentsA/test1.txt')
  console.log(statsA.isDirectory())  // false

  const statsB = fs.statSync('documentsA')
  console.log(statsB.isDirectory())  // true
} catch (err) {
  console.log(err)
}

fs.StatsisDirectoryメソッド で指定ファイルがディレクトリであるか判定することもできます。

ディレクトリ配下の一覧を取得
( readdirSync, readdir )

ディレクトリ配下の ファイル & ディレクトリ一覧 を取得します。

const fs = require('fs')

try {
  console.log(fs.readdirSync('documentsA'))
  console.log(fs.readdirSync('documentsA/documentsB'))
} catch (err) {
  console.log(err)
}
$ node file.js 
[ 'documentsB', 'test1.txt', 'test2.txt' ]
[ 'text1.txt' ]

ファイル読み込み
( readFileSync, readFile )

const fs = require('fs')

try {
  console.log(fs.readFileSync('documentsA/test1.txt', 'utf8'))
} catch (err) {
  console.log(err)
}
$ cat documentsA/test1.txt 
aaa
bbb
ccc
$ 
$ node file.js 
aaa
bbb
ccc

ファイル書き込み(新規作成 or 上書き)
( writeFileSync, writeFile )

ファイルが存在しなければ 新規作成 して、存在する場合は 上書き します。

const fs = require('fs')

try {
  fs.writeFileSync(
    'documentsA/new_test.txt',
    'あいうえお\nかきくけこ\n',
    'utf8'
  )
} catch (err) {
  console.log(err)
}
$ node file.js 
$ 
$ cat documentsA/new_test.txt 
あいうえお
かきくけこ

ファイル書き込み(追記)
( appendFileSync, appendFile )

const fs = require('fs')

try {
  fs.appendFileSync(
    'documentsA/test1.txt',
    'あああああああ\nいいいいいいい\n',
    'utf8'
  )
} catch (err) {
  console.log(err)
}
$ cat documentsA/test1.txt 
aaa
bbb
ccc
$ 
$ node file.js 
$ 
$ cat documentsA/test1.txt 
aaa
bbb
ccc
あああああああ
いいいいいいい
const fs = require('fs')

try {
  fs.unlinkSync('documentsA/test1.txt')
} catch (err) {
  console.log(err)
}
$ ls documentsA/test1.txt 
documentsA/test1.txt
$ 
$ node file.js 
$ 
$ ls documentsA/test1.txt 
ls: documentsA/test1.txt: No such file or directory

参考