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.Stats の isDirectoryメソッド で指定ファイルがディレクトリであるか判定することもできます。
ディレクトリ配下の一覧を取得
( 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
あああああああ
いいいいいいいファイル削除
( unlinkSync, unlink )
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