Electron Framework로 파일을 선택, 읽기, 저장, 삭제 또는 생성하는 방법

파일 수명주기 (CRUD)를 처리하기 위해 대화 상자  파일 시스템 구성 요소를 사용합니다 .

대화 모듈은 파일 열기 또는 경고와 같은 기본 시스템 대화 상자를 표시하는 API를 제공하므로 웹 응용 프로그램은 기본 응용 프로그램 및 Node.js 파일 시스템과 동일한 사용자 경험을 제공 할 수 있습니다.

필수 종속성로드

운영 시스템 대화 상자를 포함하여 저장, 열기 삭제 등으로 수행하려는 작업을 실행하려면 다음 종속성을로드해야합니다.

var remote = require('remote'); // Load remote compnent that contains the dialog dependency
var dialog = remote.require('dialog'); // Load the dialogs component of the OS
var fs = require('fs'); // Load the File System to execute our common tasks (CRUD)

 

노트

최신 버전의 Electron (> = 1)에서 다음 스 니펫을 사용하여 대화 상자에 액세스하십시오.

var app = require('electron').remote; var dialog = app.dialog;

// Or with ECMAScript 6 const {dialog} = require('electron').remote;

파일 만들기

파일을 만들려면 파일 시스템 을 사용 하고이 경우 시스템 의 기본 파일 저장 대화 상자 (경로를 검색)를 사용합니다. 당신이 사용할 수있는 

 

let content = "Some text to save into the file";

// You can obviously give a direct path without use the dialog (C:/Program Files/path/myfileexample.txt)
dialog.showSaveDialog((fileName) => {
    if (fileName === undefined){
        console.log("You didn't save the file");
        return;
    }

    // fileName is a string that contains the path and filename created in the save file dialog.  
    fs.writeFile(fileName, content, (err) => {
        if(err){
            alert("An error ocurred creating the file "+ err.message)
        }
                    
        alert("The file has been succesfully saved");
    });
}); 

 

파일 내용 읽기

파일 경로를 읽으려면 파일 시스템과 기본 파일 읽기 대화 상자를 사용합니다.

 

dialog.showOpenDialog((fileNames) => {
    // fileNames is an array that contains all the selected
    if(fileNames === undefined){
        console.log("No file selected");
        return;
    }

    fs.readFile(filepath, 'utf-8', (err, data) => {
        if(err){
            alert("An error ocurred reading the file :" + err.message);
            return;
        }

        // Change how to handle the file content
        console.log("The file content is : " + data);
    });
});
 

// Note that the previous example will handle only 1 file, if you want that the dialog accepts multiple files, then change the settings:
// And obviously , loop through the fileNames and read every file manually
dialog.showOpenDialog({ 
    properties: [ 
        'openFile', 'multiSelections', (fileNames) => {
            console.log(fileNames);
        }
    ]
});

 

기존 파일 내용 업데이트

기존 파일을 업데이트하려면 다음 코드를 사용하여 파일 경로 만 필요합니다 (파일 대화 상자로 다시 원하는 경우 검색하거나 이전에 저장된 파일 경로를 사용할 수 있음).

var filepath = "C:/Previous-filepath/existinfile.txt";// you need to save the filepath when you open the file to update without use the filechooser dialog againg
var content = "This is the new content of the file";

fs.writeFile(filepath, content, (err) => {
    if (err) {
        alert("An error ocurred updating the file" + err.message);
        console.log(err);
        return;
    }

    alert("The file has been succesfully saved");
});

파일 삭제

파일을 삭제하려면 파일 경로 만 있으면 존재하고 연결 해제 방법을 사용해야합니다. 존재하는 메소드는 파일이 존재하는지 점검 한 후 unlink 메소드로 파일을 삭제하도록 진행합니다.

var filepath = "C:/Path-toFile/file.txt";// Previously saved path somewhere

if (fs.existsSync(filepath)) {
    fs.unlink(filepath, (err) => {
        if (err) {
            alert("An error ocurred updating the file" + err.message);
            console.log(err);
            return;
        }
        console.log("File succesfully deleted");
    });
} else {
    alert("This file doesn't exist, cannot delete");
}

폴더 선택

폴더 경로를 검색하기 위해 대화 상자가있는 폴더를 선택할 수 있습니다.

dialog.showOpenDialog({
    title:"Select a folder",
    properties: ["openDirectory"]
}, (folderPaths) => {
    // folderPaths is an array that contains all the selected paths
    if(fileNames === undefined){
        console.log("No destination folder selected");
        return;
    }else{
        console.log(folderPaths);
    }
});

완전한 작업 예

다음 html 파일은 파일 시스템의 작동 방식을 이해하기 위해 프로젝트에서 테스트하는 데 사용할 수 있습니다. 코드는 간단한 crud UI를 생성합니다.

<!DOCTYPE html>
<html>
    <head>
        <title>Our Code World</title>
        <meta charset="UTF-8">
        <meta name="viewport" content="width=device-width, initial-scale=1.0">
    </head>
    <body>
        <div>
            <div style="text-align:center;">
                <input type="text" placeholder="Please select a file" id="actual-file" disabled="disabled"/>
                <input type="button" value="Choose a file" id="select-file"/>
            </div>
            <br><br>
            <textarea id="content-editor" rows="5"></textarea><br><br>
            <input type="button" id="save-changes" value="Save changes"/>
            <input type="button" id="delete-file" value="Delete file"/>
        </div>
        <hr>
        <div style="text-align:center;">
            <p>
                The file content will be the same as the editor.
            </p>
            <input type="button" value="Choose a file" id="create-new-file"/>
        </div>
        <script>
            var remote = require('remote'); 
            var dialog = remote.require('dialog');
            var fs = require('fs');
                
            document.getElementById('select-file').addEventListener('click',function(){
                dialog.showOpenDialog(function (fileNames) {
                    if(fileNames === undefined){
                        console.log("No file selected");
                    }else{
                        document.getElementById("actual-file").value = fileNames[0];
                        readFile(fileNames[0]);
                    }
                }); 
            },false);
            
            document.getElementById('save-changes').addEventListener('click',function(){
                var actualFilePath = document.getElementById("actual-file").value;
                
                if(actualFilePath){
                    saveChanges(actualFilePath,document.getElementById('content-editor').value);
                }else{
                    alert("Please select a file first");
                }
            },false);
            
            document.getElementById('delete-file').addEventListener('click',function(){
                var actualFilePath = document.getElementById("actual-file").value;
                
                if(actualFilePath){
                    deleteFile(actualFilePath);
                    document.getElementById("actual-file").value = "";
                    document.getElementById("content-editor").value = "";
                }else{
                    alert("Please select a file first");
                }
            },false);
            
            document.getElementById('create-new-file').addEventListener('click',function(){
                var content = document.getElementById("content-editor").value;
                
                dialog.showSaveDialog(function (fileName) {
                    if (fileName === undefined){
                        console.log("You didn't save the file");
                        return;
                    }
                    
                    fs.writeFile(fileName, content, function (err) {
                        if(err){
                            alert("An error ocurred creating the file "+ err.message)
                        }
                        
                        alert("The file has been succesfully saved");
                    });
                }); 
            },false);
            
            function readFile(filepath) {
                fs.readFile(filepath, 'utf-8', function (err, data) {
                    if(err){
                        alert("An error ocurred reading the file :" + err.message);
                        return;
                    }
                    
                    document.getElementById("content-editor").value = data;
                });
            }
            
            function deleteFile(filepath){
                fs.exists(filepath, function(exists) {
                    if(exists) {
                        // File exists deletings
                        fs.unlink(filepath,function(err){
                            if(err){
                                alert("An error ocurred updating the file"+ err.message);
                                console.log(err);
                                return;
                            }
                        });
                    } else {
                        alert("This file doesn't exist, cannot delete");
                    }
                });
            }
            
            function saveChanges(filepath,content){
                fs.writeFile(filepath, content, function (err) {
                    if(err){
                        alert("An error ocurred updating the file"+ err.message);
                        console.log(err);
                        return;
                    }
                    
                    alert("The file has been succesfully saved");
                }); 
            }
        </script>
    </body>
</html>

 

출처: https://ourcodeworld.com/articles/read/106/how-to-choose-read-save-delete-or-create-a-file-with-electron-framework

 

How to choose , read, save, delete or create a file with Electron Framework

Learn how to handle the lifecycle of a file with Electron.

ourcodeworld.com

 

'Electron' 카테고리의 다른 글

Electron Dialog !  (2) 2019.09.09
Electron 이란 !  (0) 2019.09.09

showOpenDialog 사용

showOpenDialog를 사용하면 사용자가 하나 이상의 파일 또는 폴더를 선택할 수 있습니다. 선택된 경로는 문자열 배열로 반환됩니다.

 

 

showOpenDialog  사용하면 파일 또는 폴더를 열 수 있습니다. 열린 대화 상자를 표시하려면 다음을[1-1]을 실행하세용

const { dialog } = require('electron')

const selectedPaths = dialog.showOpenDialog();
console.log(selectedPaths);

showOpenDialog는 사용자가 선택한 경로가 포함 된 문자열 배열을 반환합니다. 대신 콜백 메서드를 사용하기로 결정하면이 메서드가 반환 undefined됩니다.

 

사용할 showOpenDialog 옵션이 더 있습니다. 옵션 을 확인하려면 문서  살펴보십시오 .

에서 전자 - 가이드 응용 이 코드는 showOpenDialog를 표시하는 데 사용된다. 또한 ipc를 사용하여 기본 프로세스와 렌더러 프로세스간에 통신합니다.

const { ipcMain, dialog } = require('electron')

ipcMain.on('show-open-dialog', (event, arg)=> {

  const options = {
      //title: 'Open a file or folder',
      //defaultPath: '/path/to/something/',
      //buttonLabel: 'Do it',
      /*filters: [
        { name: 'xml', extensions: ['xml'] }
      ],*/
      //properties: ['showHiddenFiles'],
      //message: 'This message will only be shown on macOS'
    };

    dialog.showOpenDialog(null, options, (filePaths) => {
      event.sender.send('open-dialog-paths-selected', filePaths)
    });
})

위에서 볼 수 있듯이 일부 ipc-stuff가 사용됩니다. 상기 봐 dialog.js 응답이 처리되는 방식 메시지가 전송되고 방법을 볼 수 있습니다.

 

showSaveDialog 사용

저장 대화 상자는 사용자에게 대화 상자를 표시하고 선택한 경로가 포함 된 경로를 반환합니다.

 

Electron showSaveDialog를 사용하는 방법을 살펴 보겠습니다. 저장 대화 상자는 사용자가 선택한 경로가 포함 된 문자열을 반환합니다. 저장 대화 상자 만 표시하려면 최소한 이것이 필요합니다.

const { dialog } = require('electron')

const savePath = dialog.showSaveDialog(null);
console.log(savePath)

그러나 다른 대화 상자 와 마찬가지로 더 많은 작업을 수행 할 수 있습니다.

 

const { dialog, app } = require('electron')

const options = {
  defaultPath: app.getPath('documents') + '/electron-tutorial-app.pdf',
}
dialog.showSaveDialog(null, options, (path) => {
  console.log(path);
});

위의 코드는로 저장 대화 상자를 열 때 사용자에게 경로와 파일 이름을 제안합니다 defaultPath. app.getPath  사용 하여 사용자 문서 폴더의 경로를 얻은 다음 filename.pdf를 추가합니다.

또한 경로를 제공하는 콜백 메소드가 사용되도록 변경했습니다. 내가 보는 것을 권 해드립니다 showSaveDialog 문서를 사용할 수있는 더 어떤 옵션을 볼 수 있습니다.

 

showMessageBox 사용

showMessageBox는 사용자에게 질문을 표시하는 데 사용될 수 있으며, 답변에 따라 무언가를합니다.

 

showMessageBox를 사용하면 사용자가 선택할 수있는 버튼 세트없이 메시지를 표시 할 수 있습니다.

메시지 상자를 표시하는 데 필요한 최소 코드는 다음과 같습니다.

const { dialog } = require('electron')

const response = dialog.showMessageBox(null);
console.log(response);

그러나 정보가없고 OK 버튼이있는 상자 만 표시됩니다. 대화 상자는 사용자가 클릭 한 버튼의 색인이 포함 된 응답을 반환합니다.

메시지 상자에 정보 추가

상자, 질문 및 두 개의 단추에 더 많은 정보를 추가하고 콜백 메소드도 사용할 수 있습니다.

const options = {
    type: 'question',
    buttons: ['Cancel', 'Yes, please', 'No, thanks'],
    defaultId: 2,
    title: 'Question',
    message: 'Do you want to do this?',
    detail: 'It does not really matter',
    checkboxLabel: 'Remember my answer',
    checkboxChecked: true,
  };

  dialog.showMessageBox(null, options, (response, checkboxChecked) => {
    console.log(response);
    console.log(checkboxChecked);
  });

 

 

  • type 메시지 상자에 다른 아이콘을 표시합니다.
  • buttons 버튼으로 표시 될 문자열 배열입니다.
  • defaultId 상자를 열 때 어떤 버튼을 선택해야하는지 설정합니다.
  • title 일부 플랫폼에서 제목을 표시합니다.
  • message 메시지를 표시합니다.
  • detail 메시지 아래에 더 많은 텍스트를 표시합니다.
  • checkboxLabel상자에 확인란도 표시 될 수 있습니다. 이것에 대한 레이블입니다.
  • checkboxChecked 확인란의 초기 값

체크 아웃 대화 상자 문서를 더 많은 정보와 당신이 다른 설정에 대해 설정할 수있는 값을 얻을 수 있습니다.

 

showErrorBox 사용

showErrorBox는 사용자에게 오류를 표시하는 데 사용됩니다.

전자 대화 상자 showErrorBox  사용하여 사용자에게 오류 메시지를 표시하십시오. 별로 :

  1. 기본 프로세스에서 호출하십시오.
  2. 대화 상자가 필요합니다.
  3. 제목과 메시지가있는 showErrorBox ()를 호출하십시오.    
const { dialog } = require('electron')

dialog.showErrorBox('Oops! Something went wrong!', 'Help us improve your experience by sending an error report')

 

 

'Electron' 카테고리의 다른 글

Electron CRUD를 해보자 !  (2) 2019.09.16
Electron 이란 !  (0) 2019.09.09

 

일렉트론(Electron)은 Node.js를 기반으로 javascript, html, css를 사용하여 데스크탑 애플리케이션을 만드는 플랫폼입니다.
이것은 GitHub에서 모던 에디터인 Atom 에디터를 만들면서 공개한 오픈소스입니다.

웹개발자의 입장에서 보면 데스크탑 APP을 개발하는데 있어서 진입장벽이 낮을 뿐만아니라 크로스플렛폼까지 지원하여 윈도우즈, Mac OS X, 리눅스 등 다양한 OS에서 동일하게 사용할수 있는 장점이 있어서 인기가 많습니다.

 

일렉트론(Electron)은 간단하게 생각하면 웹브라우저 안에 Node.js를 포함시킨 것이라고 보시면 됩니다. 그래서 웹브라우저로 화면을 표시하고 Node.js로 OS의 파일시스템 등에 접근하여 작업을 수행 할 수 있게 되는 것입니다.

Atom 에디터 VS Code를 써보면 알겠지만 상당히 완성도가 높은 것을 알 수 있습니다. 일렉트론(Electron)으로 개발한 APP은 이것 말고도 GitHub Desktop,Slack, WordPress 등 다양한 종류가 있으며 일렉트론(Electron) 홈페이지에서 더 확인을 할 수 있습니다.

좀 더 자세한 내용은 일렉트론(Electron) 홈페이지 에서 확인하세요.




출처: https://ux.stories.pe.kr/77 [UX 공작소]

 

일렉트론(Electron) 소개 및 사용법

일렉트론(Electron)은 Node.js를 기반으로 javascript, html, css를 사용하여 데스크탑 애플리케이션을 만드는 플랫폼입니다. 이것은 GitHub에서 모던 에디터인 Atom 에디터를 만들면서 공개한 오픈소스입니다. 웹..

ux.stories.pe.kr

 

'Electron' 카테고리의 다른 글

Electron CRUD를 해보자 !  (2) 2019.09.16
Electron Dialog !  (2) 2019.09.09

+ Recent posts