Electron에서 임의의 파일을 여는 기능 구현
1. Menu, 바로 가기 키로 파일 선택 대화 상자를 열고 파일을 선택합니다.
2. 열려는 파일을 Window로 드래그 앤 드롭
3. 파일을 더블 클릭하여 Electron 앱에서 열기
이 기사에서는 1의 "Menu, 바로 가기 키로 파일 선택 대화 상자를 열고 파일을 선택하는"기능을 구현하는 방법에 대해 설명합니다.
자신의 환경은 이 기사를 참조. UI를 만드는 데 React를 사용하고 있습니다.
정보가 올바르지 않거나 더 스마트한 구현 방법이 있거나 할지도 모릅니다만 죄송합니다.
1. 아티팩트
2 구현 방법
Menu 과 dialog 은 기본적으로 메인 프로세스에서만 취급할 수 있는 것 같습니다. 그래서 메인 프로세스에서 Menu의 작성과 dialog를 표시하는 처리를 실시합니다. 그리고 dialog를 표시한 후에 렌더러 프로세스에 이벤트를 날립니다.
메인 프로세스라든지 렌더러 프로세스라든지 무엇입니까? 그렇다면 여기
main.jsconst { Menu, dialog } = require('electron')
// メニューの作成
function createMenu() {
const template = [
{
label: 'Electron',
submenu: [
{
label: 'about'
}
]
},
{
label: 'File',
submenu: [
{
label: 'Open..',
accelerator: 'CmdOrCtrl+O', // ショートカットキーを設定
click: () => { openFile() } // 実行される関数
}
]
}
]
const menu = Menu.buildFromTemplate(template)
Menu.setApplicationMenu(menu);
}
// ファイル選択ダイアログを開く
function openFile() {
dialog.showOpenDialog({ properties: ['openFile'] }, (filePath) => {
// レンダラープロセスにイベントを飛ばす
mainWindow.webContents.send('open_file', filePath);
})
}
// 未検証だけどMenuを作成するタイミングは別にここじゃなくても良い気がする。
app.on('ready', createMenu)
그리고 렌더러 프로세스 측에서 이벤트를 받는다.
App.js
import '../assets/css/App.css'
import React, { Component } from 'react'
const { remote, ipcRenderer } = require('electron')
const { Menu, MenuItem } = remote
class App extends React.Component {
constructor(props) {
super(props)
this.state = { path: '' }
this.init();
}
init() {
this.setup();
}
setup() {
// イベントを受け取る
ipcRenderer.on('open_file', (event, arg) => {
// ファイルパスからファイル名を抜き取る
let filePath = arg[0];
filePath = filePath.split('\\');
const fileName = filePath[filePath.length - 1];
console.log(fileName);
// Stateの更新
this.setState({ path: fileName });
})
}
render() {
return (
<div>
<h1>Hello, Electron!</h1>
<p>{this.state.path}</p>
</div>
)
}
}
export default App
파일이 아니라 폴더를 선택하고 싶은 경우
dialog.showOpenDialog({ properties: ['openDirectory'] }, (filePath) => {
mainWindow.webContents.send('open_file', filePath);
})
여러가지 설정할 수 있는 것 같기 때문에 공식 문서 를 참조해 주세요.
Reference
이 문제에 관하여(Electron에서 임의의 파일을 여는 기능 구현), 우리는 이곳에서 더 많은 자료를 발견하고 링크를 클릭하여 보았다
https://qiita.com/stupid_student2/items/f25c2b8c3d0ca5cdc89e
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
우수한 개발자 콘텐츠 발견에 전념
(Collection and Share based on the CC Protocol.)
Menu 과 dialog 은 기본적으로 메인 프로세스에서만 취급할 수 있는 것 같습니다. 그래서 메인 프로세스에서 Menu의 작성과 dialog를 표시하는 처리를 실시합니다. 그리고 dialog를 표시한 후에 렌더러 프로세스에 이벤트를 날립니다.
메인 프로세스라든지 렌더러 프로세스라든지 무엇입니까? 그렇다면 여기
main.js
const { Menu, dialog } = require('electron')
// メニューの作成
function createMenu() {
const template = [
{
label: 'Electron',
submenu: [
{
label: 'about'
}
]
},
{
label: 'File',
submenu: [
{
label: 'Open..',
accelerator: 'CmdOrCtrl+O', // ショートカットキーを設定
click: () => { openFile() } // 実行される関数
}
]
}
]
const menu = Menu.buildFromTemplate(template)
Menu.setApplicationMenu(menu);
}
// ファイル選択ダイアログを開く
function openFile() {
dialog.showOpenDialog({ properties: ['openFile'] }, (filePath) => {
// レンダラープロセスにイベントを飛ばす
mainWindow.webContents.send('open_file', filePath);
})
}
// 未検証だけどMenuを作成するタイミングは別にここじゃなくても良い気がする。
app.on('ready', createMenu)
그리고 렌더러 프로세스 측에서 이벤트를 받는다.
App.js
import '../assets/css/App.css'
import React, { Component } from 'react'
const { remote, ipcRenderer } = require('electron')
const { Menu, MenuItem } = remote
class App extends React.Component {
constructor(props) {
super(props)
this.state = { path: '' }
this.init();
}
init() {
this.setup();
}
setup() {
// イベントを受け取る
ipcRenderer.on('open_file', (event, arg) => {
// ファイルパスからファイル名を抜き取る
let filePath = arg[0];
filePath = filePath.split('\\');
const fileName = filePath[filePath.length - 1];
console.log(fileName);
// Stateの更新
this.setState({ path: fileName });
})
}
render() {
return (
<div>
<h1>Hello, Electron!</h1>
<p>{this.state.path}</p>
</div>
)
}
}
export default App
파일이 아니라 폴더를 선택하고 싶은 경우
dialog.showOpenDialog({ properties: ['openDirectory'] }, (filePath) => {
mainWindow.webContents.send('open_file', filePath);
})
여러가지 설정할 수 있는 것 같기 때문에 공식 문서 를 참조해 주세요.
Reference
이 문제에 관하여(Electron에서 임의의 파일을 여는 기능 구현), 우리는 이곳에서 더 많은 자료를 발견하고 링크를 클릭하여 보았다
https://qiita.com/stupid_student2/items/f25c2b8c3d0ca5cdc89e
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
우수한 개발자 콘텐츠 발견에 전념
(Collection and Share based on the CC Protocol.)
dialog.showOpenDialog({ properties: ['openDirectory'] }, (filePath) => {
mainWindow.webContents.send('open_file', filePath);
})
Reference
이 문제에 관하여(Electron에서 임의의 파일을 여는 기능 구현), 우리는 이곳에서 더 많은 자료를 발견하고 링크를 클릭하여 보았다 https://qiita.com/stupid_student2/items/f25c2b8c3d0ca5cdc89e텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
우수한 개발자 콘텐츠 발견에 전념 (Collection and Share based on the CC Protocol.)