Electron JS写入文件权限问题

时间:2019-06-18 19:40:33

标签: node.js electron

我们正在开发一个Electron JS应用程序,该应用程序应该从服务器处获取配置文件。这一直工作到一个小时前,但现在“神奇地”引发了权限错误。当我们尝试写入任何内容时,都会引发权限错误。这是我们明确测试的内容:

  • app.getPath('userData')
  • “ C:/测试”
  • app.getAppPath()

我们尝试从管理员提升的Powershell启动它,但仍然没有成功。这是我们的代码段:

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 个答案:

答案 0 :(得分:1)

由于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')
    )
}