【问题标题】:copyFileSync not copying file and not throwing errorcopyFileSync 不复制文件也不抛出错误
【发布时间】:2019-07-02 14:45:46
【问题描述】:

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

此功能旨在将文件从用户闪存驱动器复制到他们的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;
}

如您所见,我在 TRY CATCH 块内有 copyFileSync。我知道这段代码正在运行,因为在控制台中我得到了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 在继续之前都会检查错误,但它从不抛出错误,并且从不复制文件。

【问题讨论】:

  • 你可以记录这个 remote.app.getAppPath() 还是使用 __dirname
  • @SuryapratapSingh 我得到的路径是正确的。 E:\~REDACTED~\resources\app\app\files\scripts\files\t.bat(使用remote.app.getAppPath() + '\\app\\files\\scripts\\files\\t.bat')我已经验证,这是文件的位置。 __dirname 给我E:\~REDACTED~\resources\app\app
  • 能不能用async的版本,看看有没有报错?或者它正在工作?
  • @AritraChakraborty 如果我使用异步版本,如何确保文件被复制?在移动到脚本的下一部分之前,必须复制这些文件。 (脚本的下一部分关闭计算机)
  • @GrumpyCrouton 只是将下一部分粘贴到回调函数中?

标签: javascript node.js electron


【解决方案1】:

我之前遇到过类似的问题,杀毒软件(Comodo)不允许电子应用访问硬盘。

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

请检查您是否属于这种情况。

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

【讨论】:

  • 我不认为这里是这种情况,因为我认为没有防病毒软件在 OOBE 模式下运行。即使有,我的应用程序也有管理员权限。
【解决方案2】:

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

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

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

当然,在主进程上实现快速发明的“复制文件”通道的处理程序。

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

【讨论】:

  • 是否可以从渲染器进程中触发?我只想在用户执行操作时复制文件,并且必须满足其他某些条件,这些条件都在客户端中设置。
  • nodeintegration: true时fs在客户端工作
  • 我也不明白为什么不复制文件不报错?
猜你喜欢
  • 1970-01-01
  • 2016-07-04
  • 1970-01-01
  • 1970-01-01
  • 2020-08-27
  • 2021-07-29
  • 2021-01-14
  • 2015-04-04
  • 2013-10-12
相关资源
最近更新 更多