如何使用电子获取文件夹路径
How to get folder path using electron
我对电子很陌生。谁能建议我如何使用电子获取本地文件夹的相对路径? JavaScript 没有那个能力。
我有一个“选择文件”按钮(见快照),所以我的问题是,当我 select 一个文件夹并单击打开按钮时,它应该 return 整个目录路径。
为此您可以使用 Node 的 path.relative
。
正如@phuongle 在您要使用的评论中指出的那样showOpenDialog()
。像这样:
var remote = require('remote');
var dialog = remote.require('electron').dialog;
var path = dialog.showOpenDialog({
properties: ['openDirectory']
});
更新:如果以上内容不适用于您当前的 Electron 版本,您应该尝试更现代的导入:
const {dialog} = require('electron').remote;
此外,为了使用remote
,您需要在主进程中创建window时设置enableRemoteModule
:
const myWindow = new BrowserWindow({
webPreferences: {
enableRemoteModule: true
}
});
在 Electron 中,我们可以通过使用 type="file" 和 webkitdirectory 属性指定简单的输入元素来 select 目录。
<input id="myFile" type="file" webkitdirectory />
我们可以通过文件对象 document.getElementById("myFile").files[0].path
的路径 属性 获取目录完整路径
我的解决方案是简单地使用小写字母,在我的 React 组件中使用值 true
作为字符串。无需额外配置。
像这样:
<input
id="path-picker"
type="file"
webkitdirectory="true"
/>
编辑
原来像@cbartondock说的那样,会递归的去目录下找文件,不好!
我最终使用了所需的电子遥控器对话框。
关注官方IPC tutorial对我有用
主要流程:
import {dialog, ipcMain} from 'electron'
function createWindow () {
mainWindow = new BrowserWindow({/*Your electron window boilerplate*/})
ipcMain.handle('dialog:openDirectory', async () => {
const { canceled, filePaths } = await dialog.showOpenDialog(mainWindow, {
properties: ['openDirectory']
})
if (canceled) {
return
} else {
return filePaths[0]
}
})
}
预加载脚本:
import {contextBridge, ipcRenderer} from 'electron'
contextBridge.exposeInMainWorld('myAPI', {
selectFolder: () => ipcRenderer.invoke('dialog:openDirectory')
})
现在您可以从应用程序代码中调用 selectFolder 方法并获取用户输入。
window.myAPI.selectFolder().then(result=>{/* Do something with the folder path*/})
我对电子很陌生。谁能建议我如何使用电子获取本地文件夹的相对路径? JavaScript 没有那个能力。
我有一个“选择文件”按钮(见快照),所以我的问题是,当我 select 一个文件夹并单击打开按钮时,它应该 return 整个目录路径。
为此您可以使用 Node 的 path.relative
。
正如@phuongle 在您要使用的评论中指出的那样showOpenDialog()
。像这样:
var remote = require('remote');
var dialog = remote.require('electron').dialog;
var path = dialog.showOpenDialog({
properties: ['openDirectory']
});
更新:如果以上内容不适用于您当前的 Electron 版本,您应该尝试更现代的导入:
const {dialog} = require('electron').remote;
此外,为了使用remote
,您需要在主进程中创建window时设置enableRemoteModule
:
const myWindow = new BrowserWindow({
webPreferences: {
enableRemoteModule: true
}
});
在 Electron 中,我们可以通过使用 type="file" 和 webkitdirectory 属性指定简单的输入元素来 select 目录。
<input id="myFile" type="file" webkitdirectory />
我们可以通过文件对象 document.getElementById("myFile").files[0].path
我的解决方案是简单地使用小写字母,在我的 React 组件中使用值 true
作为字符串。无需额外配置。
像这样:
<input
id="path-picker"
type="file"
webkitdirectory="true"
/>
编辑
原来像@cbartondock说的那样,会递归的去目录下找文件,不好!
我最终使用了所需的电子遥控器对话框。
关注官方IPC tutorial对我有用
主要流程:
import {dialog, ipcMain} from 'electron'
function createWindow () {
mainWindow = new BrowserWindow({/*Your electron window boilerplate*/})
ipcMain.handle('dialog:openDirectory', async () => {
const { canceled, filePaths } = await dialog.showOpenDialog(mainWindow, {
properties: ['openDirectory']
})
if (canceled) {
return
} else {
return filePaths[0]
}
})
}
预加载脚本:
import {contextBridge, ipcRenderer} from 'electron'
contextBridge.exposeInMainWorld('myAPI', {
selectFolder: () => ipcRenderer.invoke('dialog:openDirectory')
})
现在您可以从应用程序代码中调用 selectFolder 方法并获取用户输入。
window.myAPI.selectFolder().then(result=>{/* Do something with the folder path*/})