Electron JS — получить путь к выбранному каталогу

#javascript #electron

#javascript #electron

Вопрос:

Я довольно новичок в мире программирования. Я создаю приложение, в котором должна быть возможность выбрать каталог, где сохранить некоторые сгенерированные файлы.

Я работаю с ipc, и кажется, что часть кода работает, но, похоже, я не могу заставить mainIpc отправить путь обратно в средство визуализации.

Я надеюсь, что улей может помочь, заранее спасибо!

Средство визуализации:

 const electron = require("electron");
const ipc = require("electron").ipcRenderer;    

createBtn.addEventListener("click", (event) => {
ipc.send("path:get");
});

ipc.on("path:selected", function (path) {
console.log("Full path: ", path);
});
 

Главная

 const ipc = require("electron").ipcMain;
const os = require("os");
const { dialog } = require("electron");

ipc.on("path:get", function (event) {
if (os.platform() === "linux" || os.platform() === "win32") {
    dialog.showOpenDialog(
        {
            properties: ["openFile"],
        },
        function (files) {
            if (files) win.webContents.send("path:selected", files[0]);
            console.log("SENT");
        }
    );
} else {
    dialog.showOpenDialog(
        {
            properties: ["openFile", "openDirectory"],
        },
        function (files) {
            if (files) win.webContents.send("path:selected", files[0]);
            console.log("SENT");
        }
    );
}
});
 

Редактировать: добавление настройки
Настройка

 const { app, BrowserWindow } = require("electron");

const ipc = require("electron").ipcMain;
const os = require("os");
const { dialog } = require("electron");

try {
    require("electron-reloader")(module);
} catch (_) {}

let win;

function createWindow() {
win = new BrowserWindow({
    width: 800,
    height: 600,
    webPreferences: {
        nodeIntegration: true,
    },
});

win.loadFile("./src/index.html");
}

app.whenReady().then(createWindow);

app.on("window-all-closed", () => {
if (process.platform !== "darwin") {
    app.quit();
}
});

app.on("activate", () => {
if (BrowserWindow.getAllWindows().length === 0) {
    createWindow();
}
});



    
 

Комментарии:

1. вы уверены win , что он доступен там, где вы его вызываете?

2. добавил свою настройку. Я объявил win об этом в глобальном масштабе. Так что я уверен, что он доступен.

Ответ №1:

Я понял это с некоторой помощью. Так что, если кому-то понадобится такая же процедура, я попытаюсь объяснить, к чему я пришел.

Итак, в основном, мне пришлось добавить then , потому что ShowDialog возвращает обещание

 if (os.platform() === "linux" || os.platform() === "win32") {
    dialog
        .showOpenDialog({
            properties: ["openFile", "openDirectory"],
        })
        .then((result) => {
            if (result) win.webContents.send("path:selected", result.filePaths);
        })
        .catch((err) => {
            console.log(err);
        });
} else {
    dialog
        .showOpenDialog({
            properties: ["openFile", "openDirectory"],
        })
        .then((result) => {
            console.log(result.filePaths);
            if (result) win.webContents.send("path:selected", result.filePaths);
        })
        .catch((err) => {
            console.log(err);
        });
}
 

});

Это отправляет обратно массив с путем в [0]

в программе визуализации я забыл добавить событие в качестве параметра.

 ipc.on("path:selected", (event, path) => {
  chosenPath = path;
  console.log("Full path: ", chosenPath[0]);
});