【问题标题】:Electron - problem creating file, error "EROFS: read-only file system"Electron - 创建文件时出现问题,错误“EROFS:只读文件系统”
【发布时间】:2020-07-07 22:00:57
【问题描述】:

嗯,我正在开发一款可以改善公司工作的应用程序。为此,我需要在没有对话框的情况下创建、保存和读取文件。

我在文档和互联网的帮助下创建了这段代码:

const electron = require('electron');
let fs = require('fs'), app = electron.remote;
let localData, fileName = "appdata.json";

function loadAppData() {
    fs.readFile(fileName, (err, data) => {
        if (err) {
            console.log("There was a problem reading the data!");
            // console.log(err);
        } else {
            console.log("Data loaded!");

            localData = JSON.parse(data);
            console.log(localData);
        }
    });
}

function saveAppData(content) {
    content = JSON.stringify(content);

    fs.writeFile(fileName, content, (err) => {
        if (err) {
            console.log("There was a problem saving data!");
            // console.log(err);
        } else {
            console.log("Data saved correctly!");
            loadAppData();
        }
    });
}

function initappData() {
    if (fs.existsSync(fileName)) {
        console.log("File detected, loading");
        loadAppData();

    } else {
        let defData = {
            "patients": [],
            "actions": [],
            "visits": []
        };
        console.log("No file! I create! Saving! Loading!");
        saveAppData(defData);
    }
}
initappData();

我有一个问题,因为如果脚本在本地版本上运行,在 MacOS 上构建应用程序后(使用 electron-builder),控制台中会出现错误:“写入数据时出现问题!”。 显示错误内容后出现:Error: EROFS: read-only file system, open 'appdata.json'.

我检查了权限,我检查了其他位置 - 还是一样 :( 我在网上寻找解决方案,但不幸的是没有解决问题。

有人遇到过这样的问题吗?

【问题讨论】:

    标签: javascript electron filesystems saving-data read-data


    【解决方案1】:

    构建之后。资源将被打包在asar 文件中 但这只是read-only。你不能修改asar里面的文件。

    如果我是你。我要将appData.json 存储在Application Support。我认为这是应用程序的流行配置。

    你可以通过这个获取Application Data路径。

    function getAppDataPath() {
      switch (process.platform) {
        case "darwin": {
          return path.join(process.env.HOME, "Library", "Application Support", "Your app name");
        }
        case "win32": {
          return path.join(process.env.APPDATA, "Your app name");
        }
        case "linux": {
          return path.join(process.env.HOME, ".Your app name");
        }
        default: {
          console.log("Unsupported platform!");
          process.exit(1);
        }
      }
    }
    
    
    function saveAppData(content) {
        const appDatatDirPath = getAppDataPath();
        
        // Create appDataDir if not exist
        if (!fs.existsSync(appDatatDirPath)) {
            fs.mkdirSync(appDatatDirPath);
        }
    
        const appDataFilePath = path.join(appDatatDirPath, 'appData.json');
        content = JSON.stringify(content);
    
        fs.writeFile(appDataFilePath, content, (err) => {
            if (err) {
                console.log("There was a problem saving data!");
                // console.log(err);
            } else {
                console.log("Data saved correctly!");
                loadAppData();
            }
        });
    }
    

    【讨论】:

    • 嗨!感谢您的回复。我想问,我应该在哪里使用这个代码?在主运行脚本中,并将其与索引文件中的 ipcRenderer 或 index.html 链接脚本中的普通 HTML 脚本一起使用?
    • 你可以在任何地方使用它。要在渲染器中使用此代码,您应该确定在创建 browserWindow 时是否启用了 nodeIntegration。但我建议你在你的 main 上做这个操作。当然,如果需要,你可以使用 ipc API。
    • 感谢您的建议 :) 所以我将修改后的代码和您的代码放入 index.html:gist.github.com/Mativve/6f33cd280e3387891e0d9cc3576b8488 在 index.js(电子的主文件)中,我有:gist.github.com/Mativve/2a5834a0eba6c43cfbf29afee24e5e0d 不幸的是,在构建我的应用程序之后在控制台中出现错误:Uncaught ReferenceError: path is not defined at getAppDataPath (index.html:19) at saveAppData (index.html:50) [...] 我尝试找到“路径”变量或全局变量的解决方案,但没有发现任何有趣的问题并解决了我的问题:/
    • 你不包括const path = require('path')
    • @OrangeSubmarine121 抱歉,我的回复太长了。这是包含 package.json、index.js 和 index.html 的代码 -> gist.github.com/Mativve/b77098ce42e6947ea35ae6e1d6a28186 希望对您有所帮助 ;)
    猜你喜欢
    • 1970-01-01
    • 2020-05-18
    • 1970-01-01
    • 2022-12-15
    • 2020-07-10
    • 2015-06-08
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多