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