0

我正在尝试遵循本教程,它包括按下按钮的部分。这将打开一个对话框窗口,将文本框的内容保存为文本文件。这包含在main.js文件中。但是,当我运行它时,窗口会打开,但是当我按下保存时,没有文件被保存。

const ipcMain = require('electron').ipcMain
const fs = require('fs')
const { dialog } = require('electron')

ipcMain.on('clickedbutton', (event, data) => {

    dialog.showSaveDialog({ 
        filters: [{ name: 'text', extensions: ['txt'] }
        ]},function (fileName) {

            if(fileName === undefined) return
            fs.writeFile(fileName, data, function (err) {

            })

     });

})

我不明白fileName参数是如何传递给函数的。然后我尝试按照这个 SO question中的建议将对话框窗口调用和函数分开,但这里的 fileName 是一个不起作用的对象。

ipcMain.on('clickedbutton',(event,data) => {

    var fileName = dialog.showSaveDialog({});

    fs.writeFile(fileName,data,function(err){});

})

我错过了什么?

4

1 回答 1

2

您链接的教程已过时。Electron 6 中的dialog函数发生了变化,从基于回调的 API(您在代码中拥有)变为基于 Promise 的 API。

对于 Electron >= 6,您希望在async函数内执行以下操作。dialog.showSaveDialogSync请注意,如果要同步运行该函数,可以替换此函数。

  const { filePath, canceled } = await dialog.showSaveDialog({
    defaultPath: "text.txt"
  });

  if (filePath && !canceled) {
    const data = new Uint8Array(Buffer.from('Hello Node.js'));
    fs.writeFile(filePath, data, (err) => {
      if (err) throw err;
      console.log('The file has been saved!');
    });
  }

请注意选项从 更改filtersdefaultPath,因为我假设您要设置默认文件名,而不是呈现text.txt对话框无法选择的现有文件。

请参阅Electron Fiddle中可打开的最小示例。在此示例中,对话框在浏览器窗口打开时直接打开。

于 2020-04-12T17:12:08.553 回答