我想得到的项目返回作为数组的文件。我已经得到了一个字符串路径dialog.showOpenDialog({properties:['openDirectory']}
。显然,我找不到一个合适的方法来从文件夹路径中获取项目。我尝试了shell.openPath('path')
,但它打开了一个新的窗口到特定的文件夹。
然后我尝试从Node.js使用fs(文件系统)。
我使用了fs.opendir(args, { encoding: "utf8", bufferSize: 64 }, (err, dir) => {if(err) {console.log(err)}}
,但是返回了undefined。有什么提示吗?
main.js
ipcMain.handle("get/folder", () => dialog.showOpenDialog({properties:['openDirectory']}))
// get the folder path
ipcMain.on("get/item", (event, args) => fs.opendir(args, { encoding: "utf8", bufferSize: 64 }, (err, dir) => {
if(err) { console.log(err)}
}))
// get the items from the folder path
preload.js
const { ipcRenderer, contextBridge } = require("electron")
const openFolder = {
GetFolder: () => ipcRenderer.invoke("get/folder"),
GetItem: (folder) => ipcRenderer.send("get/item", folder)
}
contextBridge.exposeInMainWorld("api", openFolder)
App.svelte
async function send() {
fileFolder = await api.GetFolder()
path = fileFolder.filePaths[0]
if (!fileFolder.canceled) {
files = await api.GetItem(path)
console.log(files) // returns undefined
}
}
注意:已经尝试了fs.readdir
,但仍然是undefined
。
1条答案
按热度按时间sshcrbum1#
你需要使用Node的
readdir
函数:fs.readdir(path[, options], callback)
fsPromises.readdir(path[, options])
设置
readdir
选项{withFileTypes: true}
将简化使用dirent.isDirectory()
检查返回的数组。IE:如果一个“文件”实际上是一个目录,不要将它添加到文件列表中。此外,由于文件夹对话框是在主进程中创建的,因此可以将返回值(“path”)直接传递到
fs.readdir
函数中,而不是在主进程和渲染进程之间来回发送。下面是一个最小可重复的示例,显示了
fs.readdir
的使用是多么简单,而且通过使用简单的preload.js
脚本,主进程和渲染进程之间的交互也是如此。main.js
(主进程)注意Electron的对话框“path”
result.filePaths[0]
是如何直接用作nodeFsPromise.readdir
函数中的参数的。IE:不需要在渲染进程和主进程之间来回发送。preload.js
(主进程)让我们通过定义一个方法而不是两个方法来简化事情。
以及如何使用它…
index.html
(渲染过程)由于Electron的
dialog.showOpenDialog([browserWindow, ]options)
已经返回了一个promise,我们可以直接使用.then
方法,而不是使用async
/await
函数。添加了一些用户反馈,给予您了解实现它有多简单。