在电子文件对话框中按扩展名过滤

时间:2018-01-25 22:39:22

标签: javascript electron

如何在“电子文件”对话框中按扩展名添加过滤器。例如:

function openDialogExample() {
    var remote = require('remote');
    var dialog = remote.require('dialog');

    return dialog.showOpenDialog(
      remote.getCurrentWindow(),
      {
          defaultPath: 'c:/',
          filters: [
              { name: 'All Files', extensions: ['*'] },
              { name: 'Images', extensions: ['jpg', 'png', 'gif'] },
              { name: 'Movies', extensions: ['mkv', 'avi', 'mp4'] }
            ],
          properties: ['openFile']
      }
    );
}

如何在代码库中实现它?

const app = require('electron').remote
const fs = require('fs')
const dialog = app.dialog

document.getElementById('importWallet').onclick = () => {
    dialog.showOpenDialog((fileName) => {
        if(fileName !== undefined) {
            readWallet(fileName[0])
        }
    });
}

function readWallet(filePath) {
    fs.readFile(filePath, 'utf-8', (err, data) => {
        if(err) {
            alert('An error occured while importing your wallet', err)
            return
        }
    })
}

2 个答案:

答案 0 :(得分:3)

第一步:,您必须将IPC从(主进程)main.js发送到(渲染进程)index.js。有关更多详细信息,read thisthisthis

第二步:现在您可以处理openFile或openDirectory或...

(我的代码)示例:

main.js :(带有win.webContents.send(...);我发送了ipc)

... after require some library in app.on("ready", () => {
   let appMenu = [
       {
            "label": "file",
            "submenu":
                [
                    {
                        "label": "open file",
                        "accelerator": "CmdOrCtrl+o",
                        click() {
                            showDialog("openFile");
                        },
                    }, // end ofshowSaveDialog "open file"
                    {
                        "label": "save file",
                        "accelerator": "CmdOrCtrl+s",
                        click() {
                            showDialog("saveFile");
                        },
                    }, // end of "save file"
                    {
                        "type": "separator"
                    },
                    {
                        "label": "open Directory",
                        "accelerator": "CmdOrCtrl+k+o",
                        click() {
                            showDialog("openDirectory");
                        },
                    }, // end ofshowSaveDialog "openDirectory"
                    {
                        "type": "separator"
                    },
                    {
                        "label": "exit app",
                        "accelerator": "CmdOrCtrl+X",
                        "role": "quit",
                    } // end of "exit"
                ], // end of "submenu file"
        }, // end of "file"
    ]
})
function showDialog(typeShowDialog) {
switch (typeShowDialog) {
    case "openFile":
    case "openDirectory":
        dialog.showOpenDialog(
            {
                "title": `${typeShowDialog}`,
                "properties": [`${typeShowDialog}`], // openDirectory, multiSelection, openFile
                "filters":
                    [
                        {
                            "name": "all",
                            "extensions": ["*"]
                        },
                        {
                            "name": "text file",
                            "extensions": ["txt", "text"]
                        },
                        {
                            "name": "html",
                            "extensions": ["htm", "html"]
                        },
                        {
                            "name": "style sheet",
                            "extensions": ["css"]
                        },
                        {
                            "name": "javascript",
                            "extensions": ["js"]
                        },
                        {
                            "name": "c++",
                            "extensions": ["cpp", "cc", "C", "cxx"],
                        },
                        {
                            "name": "json",
                            "extensions": ["json"]
                        },
                    ],
            }, // end of options: electron.OpenDialogOptions
            (filename) => {
                if (filename === undefined) {
                    return;
                }
                win.webContents.send(`${typeShowDialog}`, filename); // Sending Content to the Renderer Process this is a IPC
            }
        ); // end of "dialog.showOpenDialog"
        break;
    case "saveFile":
        dialog.showSaveDialog(
            {
                "title": `${typeShowDialog}`,
                "filters":
                    [
                        {
                            "name": "all",
                            "extensions": ["*"]
                        },
                        {
                            "name": "text file",
                            "extensions": ["txt", "text"]
                        },
                        {
                            "name": "html",
                            "extensions": ["htm", "html"]
                        },
                        {
                            "name": "style sheet",
                            "extensions": ["css"]
                        },
                        {
                            "name": "javascript",
                            "extensions": ["js"]
                        },
                        {
                            "name": "c++",
                            "extensions": ["cpp", "cc", "C", "cxx"],
                        },
                        {
                            "name": "json",
                            "extensions": ["json"]
                        },
                    ],
            }, // end of options: electron.SaveDialogOptions
            (filename) => {
                if (filename === undefined) {
                    return;
                }
                win.webContents.send(`${typeShowDialog}`, filename); // Sending Content to the Renderer Process this is a IPC
            }
        ); // end of "dialog.showSaveDialog"       
        break;
} // end of "switch"

} //“ showDialog”的结尾

index.js :(与ipcRenderer.on(...);我收到ipc)

    ipcRenderer.on("openFile", (event, arg) => {
      // some sttements;
});

ipcRenderer.on("openDirectory", (event, arg) => {
     // some statements;
 });

ipcRenderer.on("saveFile", (event, arg) => {
    // some statements;
});

and this is a example about ipc

答案 1 :(得分:1)

您可以根据需要为选项对象添加任意数量的过滤器。您只需要确保不要多次添加它们 - 因为没有检查唯一性。

的index.html

<!DOCTYPE html>
<html>

<body>
    <button id="importWallet">Import wallet</button>
    <script src="./index.js"></script>
</body>

</html>

index.js

const app = require("electron").remote;
const fs = require("fs");
const dialog = app.dialog;

//customize this one as you like
const dialogOptions = {
  defaultPath: "c:/",
  filters: [
    { name: "All Files", extensions: ["*"] },
    { name: "Images", extensions: ["jpg", "png", "gif"] },
    { name: "Movies", extensions: ["mkv", "avi", "mp4"] }
  ],
  properties: ["openFile"]
};

document.getElementById("importWallet").onclick = () => {
  const unicornFilter = dialogOptions.filters.find(item => {
    if (item.name === "Unicorn") {
      return item;
    } else {
      return undefined;
    }
  });

  if (!unicornFilter) {
    const myUnicornFilter = {
      name: "Unicorn",
      extensions: ["unicorn", "horse"]
    };
    dialogOptions.filters.push(myUnicornFilter);
  }

  dialog.showOpenDialog(dialogOptions, fileName => {
    if (fileName !== undefined) {
      console.log(fileName);
      readWallet(fileName[0]);
    }
  });
};

function readWallet(filePath) {
  fs.readFile(filePath, "utf-8", (err, data) => {
    if (err) {
      alert("An error occured while importing your wallet", err);
      return;
    }
  });
}