ファイルとディレクトリの操作 - Node.js

  • 作成日:
  • 最終更新日:2025/06/25

fs とは?

fs モジュールは、Node.js のファイルを取り扱うモジュールです。

fs モジュールは、「 同期形式 」と「 非同期形式 」の両方が提供されています。

「synchronize(シンクロナイズ)」の頭文字をとっています。

  • synchronize(シンクロナイズ):同期させる

ファイルの作成

ファイルを作成する構文は、次のように記述します。

非同期通信

fs.writeFile('ファイルのパス', 'ファイルへ書きこむ内容', '文字コード', コールバック関数)

同期

fs.writeFileSync('ファイルのパス', 'ファイルへ書きこむ内容', '文字コード')

同一のファイル名が存在する場合は、ファイルの内容が上書きされます。

非同期通信

const fs = require('fs');

fs.writeFile('./test.txt', 'Hello, World', 'utf8', (err) => {
    if(err){
        console.log(err);
    } else {
        console.log('保存しました。');
    }
});

同期

const fs = require('fs');
fs.writeFileSync('./test.txt', "Hello, World", 'utf8');

ファイルへの追記

ファイルに追記する構文は、次のように記述します。

非同期

fs.appendFile(ファイルのパス, 追記したいデータ,  コールバック関数)

同期

fs.writeFileSync(ファイルのパス, 追記したいデータ)

非同期

const fs = require('fs');

fs.appendFile('./test.txt', 'Hello, World', (err) => {
    if(err){
        console.log(err);
    } else {
        console.log("ファイルに保存しました。");
    }
});

同期

const fs = require('fs');
fs.appendFileSync('./test.txt', 'Hello, World', 'utf8');

ファイルの読み込み

ファイルを読み込む構文は、次のように記述します。

非同期

fs.readFile(ファイルのパス, 文字コード,  コールバック関数)

同期

fs.readFileSync(ファイルのパス, 文字コード)

非同期

const fs = require('fs');

fs.readFile('./test.txt', 'utf8', (err, data) => {
    if(err){
        console.log(err);
    } else {
        console.log(data);
    }
});

同期

const fs = require('fs');
let data = fs.readFileSync('./test.txt', { encoding: 'utf8' });
console.log(data);

サンプル

const fs = require('fs');

function readFile(file){
    return new Promise((resolve, reject) => {
        fs.readFile(file, 'utf8', (err, data) => {
            if(err){
                reject(err);
            } else {
                resolve(data);
            }
        })
    })
}

readFile('./test.txt').then((data) => {
    console.log(data);
}).catch((err) => {
    console.error("エラー:" + err);
})

// ---------------------------------------------------------------------
const fs = require('fs');

fs.readFile("./tet.txt", 'utf8', (err, file)=> {
    return new Promise((resolve, reject) => {
        if(err){
            reject(err)
        } else {
            resolve(file)
        }
    }).then((data) => {
        console.log(data);
    }).catch((err) => {
        console.log("Error")
    })
})

ファイルの削除

ファイルを削除する構文は、次のように記述します。

非同期

fs.unlink(ファイルのパス, コールバック関数)

同期

fs.unlinkSync(ファイルのパス)
const fs = require('fs');

fs.unlink('./sample.txt', (err) => {
    if(err){
        console.log(err);
    } else {
        console.log("ファイルを削除しました。");
    }
});

指定されたファイルが存在しない場合は、例外が発生します。

同期

const fs = require('fs');

try{
    fs.unlinkSync('./sample.txt');
    console.log('削除しました。');
} catch(err) {
    console.log(err);
}

ファイルのリネーム

ファイルをリネームする構文は、次のように記述します。

非同期

fs.rename(before_file_Path, after_file_Path, コールバック関数);

同期

s.renameSync(before_file_Path, after_file_Path, コールバック関数);

ファイルの移動

rename または renameSync を使うとファイルの移動もできます。

fs.rename(beforePath, afterPath, err => {});

ファイルの移動 - 非同期

fs.rename('./images/sample.jpg', './destination/sample.jpg', (err) =>{
  // コールバック
})

ファイルの移動 - 同期

fs.renameSync('./images/sample.jpg', './destination/sample.jpg');

リネームしてのファイルの移動 - 非同期

fs.rename('./images/sample1.jpg', './destination/sample.jpg', (err) => {
  // コールバック
})

リネームしてのファイルの移動 - 同期

fs.renameSync('./images/sample1.jpg', './destination/sample.jpg');

ファイルのコピー

非同期

const fs = require("fs");
fs.copyFile("./test.txt","./test/test.txt", (err) => {
    if(err){
        console.log(err);
    } else {
        console.log("コピーが完了しました。");
    }
});

同期

const fs = require("fs");
fs.copyFileSync("./test.txt","./test/test.txt");

今日の日付のファイルを作成する

次のファイルを実行すると同じディレクトリ上に「 日誌_(本日の日付).txt 」という形式のファイルが作成されます。「 (本日の日付) 」の部分にローカル上の時間が入ります。

const fs = require('fs');
let date_time = new Date();

const zeroPadding = (num, digit) => {
  let ret = (('0'.repeat(digit)) + num).slice(-digit);
  return ret;
}

let str = "日誌";
let date = date_time.getFullYear() + zeroPadding(date_time.getMonth() + 1, 2) + date_time.getDate();

fs.writeFile(`./${str}_${date}.txt`, '', (err) => {});

現在のディレクトリ名を取得する

const path = require('path');

console.log(__dirname); // フルパスで表示

console.log(path.basename(__dirname)); // 現在のディレクトリ名のみ取得

ディレクトリの作成

すでにディレクトリが存在する場合は、エラーになります。

const fs = require('fs');

fs.mkdir('test', (err) => {
  if(err) { throw err; }
  console.log("testというディレクトリが作成されました。");
})

ディレクトリが存在しない場合、ディレクトリを作成するには以下のようにします。

const path = require('path');
const fs = require('fs');

let dir_name = 'test'
let dirpath = "./upload/" + dir_name;

if( fs.existsSync( dirpath ) ){
    console.log(`「 ${dir_name} 」ディレクトリは、すでに存在します。`);
}else{
    fs.mkdir('./upload/' + dir_name, (err) => {
    if(err) { throw err; }
        console.log(`「 ${dir_name} 」というディレクトリが作成されました。`);
    })
}

空のディレクトリの削除

ディレクトリ内に、ファイルやサブディレクトリがある場合はエラーになります。

const fs = require('fs');

fs.rmdir('test', (err) => {
  if (err) throw err;

  console.log('test ディレクトリを削除しました');
});

一時ディレクトリにファイルを作成してリネームする

const fs = require('fs');
const dir = fs.mkdtempSync('./tmp-dir');

fs.writeFileSync('./' + dir + '/test.txt', "");
fs.renameSync('./' + dir + '/test.txt', './upload/success.txt');

const delDir = async function(path){
    await fs.rm(path, { recursive: true }, () => {
        console.log("削除完了");
    });
}

delDir(dir)