Écrire dans le fichier dans « appData » dans Electron. Où ajouter l'importation {app} de « électron » ;?

voix
0

Je fais ma première application électronique. Je suis en train d'enregistrer un fichier texte dans le dossier appData ( par exemple C: \ Users \ user \ AppData \ Roaming). Je sais que je dois ajouter importer {app} de « électron »; où certains mais je ne suis pas sûr où placer.

Dans mes index.js JAVASCRIPT Je vous écris les paramètres de base de données que les utilisateurs soumet sous sa forme dans un fichier texte. C'est là que je dois avoir l'adresse du répertoire 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);

Mon code complet est ci-dessous:

./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.
Créé 13/01/2020 à 23:58
source utilisateur
Dans d'autres langues...                            


2 réponses

voix
2

Je sais que je dois ajouter importer {app} de « électron »; où certains mais je ne suis pas sûr où placer.

L' application module est toujours (dans mon expérience) importé dans votre mainprocessus afin que vous puissiez contrôler le cycle de vie des applications. Cependant, si vous voulez utiliser certaines des appfonctionnalités du module dans votre rendererprocessus, vous pouvez l' importer là à travers le remotemodule (comme indiqué dans la réponse acceptée à cette question: Comment utiliser app.getPath () d'électrons pour stocker des données )

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

Les mainet les rendererprocessus sont les concepts clés , Electrondonc je vous suggère de lire sur ceux -ci . L'essentiel est que vous avez un mainprocessus - il n'a pas de représentation visuelle et il est impliqué dans le cycle de vie de votre application, la création et la destruction des rendererprocessus (comme BrowserWindows ), la communication entre les processus de rendu, etc. - et vous pouvez avoir autant de rendererprocessus que vous avez besoin.

Donc , si vous voulez lire et les fichiers d'écriture , vous pouvez le faire dans le rendererprocessus comme indiqué ci - dessus - ou vous pouvez le faire dans le mainprocessus. Dans ce dernier cas, si un rendererprocessus veut enregistrer un fichier, il peut message que le mainprocessus par IPC , l' envoi des données à sauvegarder.

Quelle façon de faire est un choix architectural.

Créé 14/01/2020 à 02:08
source utilisateur

voix
1

Pour obtenir le chemin d'application à votre processus principal . Ensuite , utilisez ce code à votre 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, ...);
    }
}

Et allez obtenir le chemin du renderer puis utilisez ce code à votre renderer

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

Mais à l' utilisation qui sont à votre moteur de rendu, s'il vous plaît assurez - vous que nodeintegration est vrai.

Si je vous, j'allais obtenir le chemin d'application au processus principal et stocker le fichier au processus principal ainsi. Par conséquent, l' importation de nombreuses dépendances au processus de renderer est pas un bon choix. Le processus de renderer prend principalement soin de montrer votre application dans le navigateur Chrome.

Donc , pour faire cette opération au processus principal . Utilisez ceci

à votre 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)
  });

A votre processus de renderer ajoutez ce code.

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

Comme vous pouvez le voir, au processus de rendu , cela envoie le inp_dataà votre processus principal par « WRITE_TEXT » canal IPC .

Une chose ici, à votre code. Vous connectez votre DB à votre moteur de rendu et il est possible, mais ce n'est pas un bon choix. S'il vous plaît penser pendant que vous avez le plusieurs renderer. Vous devez déplacer ce processus au principal aussi.

Créé 14/01/2020 à 05:32
source utilisateur

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