😸

electron node.js ファイル書き込み読み込み 自分用備忘録

に公開

index.js(main.js)


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

//ipcmainの読み込みも忘れずに

const data_dir = path.join(app.getAppPath(), '01_soft_data'); // '01_soft_data'ディレクトリの絶対パス
const user_data_path = path.join(data_dir, 'user.json'); // 'user.json'ファイルの絶対パス



ipcMain.on('file_write', (event, json_data) => {


    try {
        if (!fs.existsSync(data_dir)) {
            fs.mkdirSync(data_dir, { recursive: true });
            console.log(`Directory created: ${data_dir}`);
        }

        // 2. 受け取ったデータ(通常はJavaScriptオブジェクト)をJSON文字列に変換
        // 受け取り側で既に文字列化されている可能性もありますが、安全のためにチェック/変換
        const data_to_write = typeof json_data === 'string' ? json_data : JSON.stringify(json_data, null, 2);

     
        fs.writeFileSync(user_data_path, data_to_write, 'utf-8');
        console.log(`JSON file written successfully to: ${user_data_path}`);
        event.reply('file_write_reply', { success: true });

    } catch (err) {
        console.error('Error writing JSON file:', err);
        event.reply('file_write_reply', { success: false, error: err.message });
    }
});


ipcMain.on('file_read', (event) => {
  
    try {
        let file_content = null;

       
        if (fs.existsSync(user_data_path)) {
          
            file_content = fs.readFileSync(user_data_path, { encoding: 'utf-8' });
            console.log(`JSON file read successfully from: ${user_data_path}`);
        } else {
            console.log(`JSON file not found at: ${user_data_path}. Returning empty data.`);
            file_content = "{}";
        }
        

        event.reply('file_read_reply', { success: true, data: JSON.parse(file_content) });

    } catch (err) {
        console.error('Error reading JSON file:', err);
        event.reply('file_read_reply', { success: false, error: err.message });
    }
});

renderer.js




function init() {
  window.addEventListener('DOMContentLoaded', () => {
    doAThing()
  })
}
// main からの呼び出しを待ち受ける
window.electron.ipcRenderer.on('async-test-complete', (event, message) => {
    console.log(message)
})

function doAThing() {

  const ipcHandlerBtn = document.getElementById('ipcHandler')
  ipcHandlerBtn?.addEventListener('click', () => {
    //window.electron.ipcRenderer.send('ping','test_message')

        // データを準備
    const userSettings = { theme: 'dark', fontSize: 14 };

    // メインプロセスにデータを送信
    window.electron.ipcRenderer.send('file_write', userSettings);
    window.electron.ipcRenderer.send('file_read');
  })
}
// メインプロセスからの応答を待つ
window.electron.ipcRenderer.on('file_write_reply', (event, result) => {
    if (result.success) {
        console.log('設定ファイルが正常に保存されました。');
    } else {
        console.error('設定ファイルの保存に失敗しました:', result.error);
    }
});

// メインプロセスからの応答を待つ
window.electron.ipcRenderer.on('file_read_reply', (event, result) => {
    if (result.success) {
        console.log('設定ファイルが正常に読み込まれました');
        console.log(result.data);
    } else {
        console.error('設定ファイルが読み込めませんでした:', result.error);
    }
});
init()

Discussion