Запись в файл в «AppData» в Electron. Где добавить импорт {приложение} из «электрон» ;?

голоса
0

Я делаю мое первое приложение Electron. Я пытаюсь сохранить текстовый файл в папку AppData (например , C: \ Users \ User \ AppData \ Roaming). Я знаю , что нужно добавить импорт {приложение} из «электрона»; где некоторые , но я не уверен , куда поместить его.

В моих index.js JavaScript Я пишу настройки базы данных о том, что пользователь вносит представление в его форме в текстовый файл. Здесь мне нужно иметь адрес каталога AppData.

// Write data to text file
var filepath = app.getPath(appData) 
var filename = database_quick_image_forensics.txt
var inp_data = inp_host + | + inp_username + | + inp_password + | + inp_database_name + | + inp_table_prefix;
write_to_file(filepath, filename, inp_data);

Весь мой код ниже:

./setup/index.html

<!DOCTYPE html>
<html>
<head>
    <meta charset=UTF-8>
    <title>Setup</title>
    <!-- https://electronjs.org/docs/tutorial/security#csp-meta-tag -->

        <!-- CSS -->
            <link rel=stylesheet type=text/css href=../_webdesign/dark/dark.css />
        <!-- // CSS -->


    <!-- jQuery -->
    <script>window.$ = window.jQuery = require('../javascripts/jquery/jquery-3.4.1.js');</script>
    <script src=../javascripts/jquery/jquery-3.4.1.js charset=utf-8></script>
    <!-- //jQuery -->

    <!-- jQuery -->
    <script src=./index.js charset=utf-8></script>
    <!-- //jQuery -->
</head>
<body>
<div id=main_single_column>
  <h1>Setup</h1>

<!-- Feedback -->
    <div id=feedback_div class=success>
        <p id=feedback_p>Success</p>
    </div>
<!-- //Feedback -->

<!-- Database connection form -->

      <p>Host:<br />
      <input type=text name=inp_host id=inp_host value=localhost />
      </p>

      <p>Port:<br />
      <input type=text name=inpport id=inp_port value= />
      </p>

      <p>Username:<br />
      <input type=text name=inp_username id=inp_username value=root />
      </p>

      <p>Password:<br />
      <input type=text name=inp_password id=inp_password />
      </p>

      <p>Database name:<br />
      <input type=text name=inp_database_name id=inp_database_name value=quick />
      </p>

      <p>Table prefix:<br />
      <input type=text name=inp_table_prefix id=inp_table_prefix value=cf_ />
      </p>

      <p>
      <button id=form_connect_to_database_submit>Connect to database</button>
      </p>

<!-- //Database connection form -->
</div>



</body>
</html>

./setup/index.js

const fs = require('fs');

// Action = On submit
$(document).ready(function(){

    $(#form_connect_to_database_submit).click( function() {
        // Feedback
        $('#feedback_div').show();
        $('#feedback_div').removeClass(success);
        $('#feedback_div').addClass(info);
        $('#feedback_p').text(Connecting!)

        // get all the inputs
        var inp_host = $(#inp_host). val();
        var inp_username = $(#inp_username). val();
        var inp_password = $(#inp_password). val();
        var inp_database_name = $(#inp_database_name). val();
        var inp_table_prefix = $(#inp_table_prefix). val();

        // Test connection
        var connection_result = connect_to_database(inp_host, inp_username, inp_password, inp_database_name, inp_table_prefix);
        if(connection_result != connection_ok){
            // Connection Failed
            $('#feedback_div').removeClass(info);
            $('#feedback_div').addClass(error);
            $('#feedback_p').text(connection_result)
        }
        else{
            // Connection OK
            $('#feedback_div').removeClass(info);
            $('#feedback_div').addClass(success);
            $('#feedback_p').text(Connected)

            // Write data to text file
            var filepath = app.getPath(appData) 
            var filename = database_quick_image_forensics.txt
            var inp_data = inp_host + | + inp_username + | + inp_password + | + inp_database_name + | + inp_table_prefix;
            $('#feedback_p').text(Connected  + filepath)
            write_to_file(filepath, filename, inp_data);

            // Feedback
            $('#feedback_div').removeClass(info);
            $('#feedback_div').addClass(success);
            $('#feedback_p').text(Connected to)
        }




    });
    $('#inp_host').focus();
});


// Function connect to database
function connect_to_database(inp_host, inp_username, inp_password, inp_database_name, inp_table_prefix){
    var mysql = require('mysql');

    // Add the credentials to access your database
    var connection = mysql.createConnection({
        host     : inp_host,
        user     : inp_username,
        password : null, // or the original password : 'apaswword'
        database : inp_database_name
    });

    // connect to mysql
    connection.connect(function(err) {
        // in case of error
        if(err){
            console.log(err.code);
            console.log(err.fatal);
            return err.code;
        }
    });


    // Perform a query
    $query = 'SELECT * FROM `cf_admin_liquidbase` LIMIT 10';
    connection.query($query, function(err, rows, fields) {
        if(err){
            console.log(An error ocurred performing the query.);
            console.log(err);
            return;
        }
        console.log(Query succesfully executed, rows);
    });

    return connection_ok;
} // connect_to_database




// Function write setup
function write_to_file(filepath, filename, inp_data){


    var fullpath = filepath + \\ + filename;
    fs.writeFile(fullpath, inp_data, (err) => {
        // throws an error, you could also catch it here
        if (err) throw err;
        // success case, the file was saved
        console.log('Lyric saved!');
    });
} // write_to_file

./main.js

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


// Keep a global reference of the window object, if you don't, the window will
// be closed automatically when the JavaScript object is garbage collected.
let win


function createWindow () {
  // Create the browser window.
  win = new BrowserWindow({
          width: 800,
          height: 600,
          webPreferences: {
          nodeIntegration: true
          }
  })

  // and load the index.html of the app.
  win.loadFile('index.html')

  // Open the DevTools.
  // win.webContents.openDevTools()

  // Emitted when the window is closed.
  win.on('closed', () => {
          // Dereference the window object, usually you would store windows
          // in an array if your app supports multi windows, this is the time
          // when you should delete the corresponding element.
          win = null
  })
}

// This method will be called when Electron has finished
// initialization and is ready to create browser windows.
// Some APIs can only be used after this event occurs.
app.on('ready', createWindow)

// Quit when all windows are closed.
app.on('window-all-closed', () => {
  // On macOS it is common for applications and their menu bar
  // to stay active until the user quits explicitly with Cmd + Q
  if (process.platform !== 'darwin') {
          app.quit()
  }
})

app.on('activate', () => {
  // On macOS it's common to re-create a window in the app when the
  // dock icon is clicked and there are no other windows open.
  if (win === null) {
          createWindow()
  }
})

// In this file you can include the rest of your app's specific main process
// code. You can also put them in separate files and require them here.
Задан 13/01/2020 в 23:58
источник пользователем
На других языках...                            


2 ответов

голоса
2

Я знаю, что нужно добавить импорт {приложение} из «электрона»; где некоторые, но я не уверен, куда поместить его.

Приложение модуль всегда (по моему опыту) , ввозимые в вашем mainпроцессе , так что вы можете управлять жизненным циклом приложений. Тем не менее, если вы хотите использовать некоторые из appфункциональных возможностей модуля в вашем rendererпроцессе, вы можете импортировать его там через remoteмодуль (как показаны в общепринятом ответ на этот вопрос: Как использовать электрон app.getPath () для хранения данных )

const remote = require('electron').remote;
const app = remote.app;
console.log(app.getPath('userData'));

mainИ rendererпроцессы являются ключевыми понятиями в Electronтак что я предложил бы читать на них. Суть в том , что у вас есть один mainпроцесс - это не имеет никакого визуального представления , и он связан с жизненным циклом приложения, созданием и уничтожением rendererпроцессов (например , BrowserWindows ), связи между процессами обработки и т.д. - и вы можете иметь столько же rendererпроцессы , как тебе нужно.

Так что, если вы хотите читать файлы и записи вы можете сделать это в rendererпроцессе , как показано выше - или вы можете сделать это в mainпроцессе. В последнем случае, если rendererпроцесс хочет сохранить файл, он может сообщение , которое mainпроцесс через IPC , посылая данные , которые будут сохранены.

Какой путь вы делаете это архитектурный выбор.

Ответил 14/01/2020 в 02:08
источник пользователем

голоса
1

Для того, чтобы получить путь приложения на свой основной процесс . Затем используйте этот код на ваш main.js

switch(process.platform) {
    case 'darwin': {
      return path.join(process.env.HOME, 'Library', 'Application Support', ...);
    }
    case 'win32': {
      return path.join(process.env.APPDATA, ...);
    }
    case 'linux': {
      return path.join(process.env.HOME, ...);
    }
}

И собираешься получить путь от визуализатора затем использовать этот код на свой визуализаторе

const remote = require('electron').remote;
const app = remote.app;
console.log(app.getPath('userData'));

Но использование требует в видеообработки, пожалуйста , убедитесь , что nodeintegration верно.

Если бы я тебя, я собирался получить путь приложения в главном процессе и сохранить файл в главном процессе , а также. Следовательно, импорт много зависимостей в процессе рендеринга не выбор хороший. Процесс визуализации в основном заботится о показывая свое приложение в браузере Chromium.

Таким образом , чтобы сделать эту операцию в основном процессе . Использовать этот

в вашем main.js

  const { ipcMain } = require('electron')
  const appPath = () => {
    switch(process.platform) {
      case 'darwin': {
        return path.join(process.env.HOME, 'Library', 'Application Support');
      }
      case 'win32': {
        return process.env.APPDATA;
      }
      case 'linux': {
        return process.env.HOME;
      }
    }
  }

  const writeToFile = (fileName, inData) => {
      const fullPath = path.join(appPath(), "\\", fileName);
      fs.writeFile(fullPath, inData, (err) => {
        // throws an error, you could also catch it here
        if (err) throw err;
        // success case, the file was saved
        console.log('Lyric saved!');
    });
  } // write_to_file

  ipcMain.on('WRITE_TEXT', async (event, arg) => {
    writeToFile(arg.fileName, arg.inData)
  });

В вашем процессе визуализатора добавить этот код.

const {ipcRenderer} = require('electron')
ipcRenderer.sendSync('WRITE_TEXT',{fileName, inData})

Как вы можете видеть, в процессе рендеринга , это посылает inp_dataк вашему основному процессу через «WRITE_TEXT» канал IPC .

Еще одна вещь здесь, в вашем коде. Вы подключаете DB на видеообработки и это возможно, но это не правильный выбор. Пожалуйста, подумайте, пока вы имея несколько визуализатора. Вы должны переместить это основной процесс тоже.

Ответил 14/01/2020 в 05:32
источник пользователем

Cookies help us deliver our services. By using our services, you agree to our use of cookies. Learn more