我们正在开发一个Electron JS应用程序,该应用程序应该从服务器处获取配置文件。这一直工作到一个小时前,但现在“神奇地”引发了权限错误。当我们尝试写入任何内容时,都会引发权限错误。这是我们明确测试的内容:
我们尝试从管理员提升的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");
答案 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')
)
}