Проблемы с правами на запись в Electron JS - PullRequest
1 голос
/ 18 июня 2019

Мы разрабатываем приложение Electron JS, которое должно получить файл конфигурации с сервера в одной части.Это работало до часа назад, но теперь оно «волшебным образом» выдает ошибку разрешения.Он выдает ошибку разрешения, когда мы пытаемся написать что-нибудь.Вот что мы явно протестировали:

  • app.getPath ('userData')
  • "C: / test"
  • app.getAppPath ()

Мы пытались запустить его из-под повышенного уровня администратора, но все равно безуспешно.Это наш фрагмент кода:

function canWrite(path, callback) {
    fs.access(path, fs.W_OK, function (err) {
        callback(null, !err);
    });
}

function downloadFile(url, target, target_name) {
    canWrite(target, function (err, isWritable) {
        if (isWritable){
            electronDl.download(
                BrowserWindow.getFocusedWindow(),
                url,
                {
                    directory: target,
                    filename: target_name
                }
            )
            console.log("Downloaded from: " + url + " to: " + target);
            return true;
        } else {
            console.log("No permission to write to target");
            return false;
        }
    });
}
downloadFile(REMOTEURL, app.getPath('userData'), 'sessionfile.json');

Мы переписали этот код, попытались изменить имена файлов, попробовали его без имени файла (..) и сейчас у нас нет идей.Кроме того, мы реализовали проверку файла (существует ли файл или нет) и, если это так, удаление перед выполнением этого.Мы закомментировали его сейчас для отладки, потому что он работал раньше.

Обновление: После того, как кто-то отметил, что внешняя проверка довольно бесполезна, я обновил код до этого (до сих пор неработа):

function downloadFile(url, target) {
    electronDl.download(
        BrowserWindow.getFocusedWindow(),
        url,
        {
            directory: target,
        }
    )
}
downloadFile(REMOTEURL, "C:/test");

1 Ответ

1 голос
/ 19 июня 2019

Поскольку кажется, что electron-dl не выдает четких сообщений об ошибках, вы можете проверить / создать каталог заранее, как вы изначально это делали.

Основная процедура может выглядеть следующим образом:

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

Следующий код реализует эту идею (для простоты используются синхронные версии методов fs).При необходимости обязательно используйте асинхронные версии.

const electronDl = require('electron-dl')
const fs = require('fs')

function ensureDirExistsAndWritable(dir) {
    if (fs.existsSync(dir)) {
        try {
            fs.accessSync(dir, fs.constants.W_OK)
        } catch (e) {
            console.error('Cannot access directory')
            return false
        }
    }
    else {
        try {
            fs.mkdirSync(dir)
        }
        catch (e) {
            if (e.code == 'EACCES') {
                console.log('Cannot create directory')
            }
            else {
                console.log(e.code)
            }
            return false
        }
    }
    return true
}


function downloadFile(url, target) {
    if (ensureDirExistsAndWritable(target) == false) {
        return
    }

    electronDl.download(
        BrowserWindow.getFocusedWindow(),
        url,
        {
            directory: target,
        }
    )
    .then(
        dl => console.log('Successfully downloaded to ' + dl.getSavePath())
    )
    .catch(
        console.log('There was an error downloading the file')
    )
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...