copyFileSync不复制文件也不抛出错误

时间:2019-07-01 13:38:20

标签: javascript node.js electron

我正在运行一个用JavaScript在nodejs / Electron客户端中编写的函数。

此功能旨在将文件从用户闪存驱动器复制到其c:/Windows/System32(文件正在此处复制,以便下次在触摸计算机时可以从命令提示符下手动运行该文件而无需切换目录)

问题是,文件没有被复制,并且copyFileSync没有引发错误。

这是我特别有问题的代码:

try {
    console.log('copying t.bat');
    fs.copyFileSync(remote.app.getAppPath() + '\\app\\files\\scripts\\files\\t.bat', 'C:\\Windows\\System32\\t.bat');
} catch(err) {

    console.log('could not copy t.bat', err);

    $('#mfail_title').text('Could not copy t.bat file');
    $('#mfail_data').text(err);

    UIkit.modal("#master_fail").show();

    return false;
}

如您所见,我在copyFileSync块中有TRY CATCH。我知道这段代码正在运行,因为在控制台中我得到了copying t.bat,但除此之外什么都没有。

如何复制文件,或者至少在无法复制文件时抛出错误?

此客户端在各种Windows 10计算机上以OOBE模式运行,因此始终具有管理员访问权限。


我试图更新到copyFile的异步版本,但是我遇到了同样的问题。这是我的代码

var source = remote.app.getAppPath() + '\\app\\files\\scripts\\files\\t.bat';
var destination = 'C:\\Windows\\System32\\t.bat';

fs.copyFile(source, destination, (err) => {
    if (err) {
        console.log(err);
    } else {

        source = remote.app.getAppPath() + '\\app\\files\\scripts\\files\\p.bat';
        destination = 'C:\\Windows\\System32\\p.bat';

        fs.copyFile(source, destination, (err) => {
            if (err) {
                console.log(err);
            } else {

                source = remote.app.getAppPath() + '\\app\\files\\scripts\\files\\p.bat';
                destination = 'C:\\Windows\\System32\\p.bat';

                child = spawn("powershell.exe",['-ExecutionPolicy', 'ByPass', '-File', remote.app.getAppPath() + '\\app\\files\\scripts\\' + type + '.ps1']);

            }
        });

    }
});

这应该复制一个文件,然后在完成后复制另一个文件,一旦完成,它应该运行powershell脚本。

每个copyFile在继续操作之前都会检查错误,但是它永远不会引发错误,并且永远不会复制文件。

2 个答案:

答案 0 :(得分:0)

我之前有一个类似的问题,其中 Antivirus (Comodo)不允许电子应用访问硬盘驱动器。

在这种情况下,复制和其他文件操作也同样成功,因为在这种情况下,电子可以访问相应的沙箱

请检查您是否遇到这种情况。

您实际上可以从电子设备在控制台中访问“ fs”并检查文件系统中的其他内容。

答案 1 :(得分:0)

对我来说,好像您在渲染器进程(客户端)上使用fs一样,它将不起作用(假设您的fs是node.js fs模块和(*))。您的第一个脚本似乎使用jQuery(渲染器提示),第二个脚本在第一行中使用remote。

fs只能(*)用于主要过程,您需要创建一个IRC通道并执行以下操作:

ircRenderer.sendSync('copy-file-sync', {from: '/from/path', to: '/to/path'})

当然,并在主进程中实现该快速创建的“复制文件”通道的处理程序。

(*)编辑:我在nodeIntegration = true上玩的不多,因此fs可能会或可能不会在BrowserWindow上设置了该标志的渲染器进程上工作。但是irc消息传递肯定可以正常工作,否则,问题可能出在电子外部,可能与文件权限有关。