【问题标题】:Copy asar file using NodeJS file system (fs)使用 NodeJS 文件系统 (fs) 复制 asar 文件
【发布时间】:2017-12-17 14:30:00
【问题描述】:

我的目标是使用 NodeJS 的文件系统复制一个 .asar 文件。我有一个文件路径,需要将 .asar 文件复制到另一个目的地。

文件路径示例:

C:/Users/redacted/Documents/ExampleElectronApp/example.asar

我需要将此文件(存档)复制到另一个目录。

之前我使用 walk and copy 函数复制了它,但它最终创建了一个名为 filename.asar 的目录,而不是一个名为 filename.asar 的实际文件 这个函数似乎适用于所有其他文件,并且正确的文件夹(.asar 档案除外)。

我的尝试

1:使用读写流复制存档。

var fs = require('fs');
fs.createReadStream('C:/Users/redacted/Documents/redacted/node_modules/electron-prebuilt/dist/resources/default_app.asar').pipe(fs.createWriteStream('C:/Users/redacted/Desktop/test.asar'));

这最终给出了一个错误:

它说找不到此文件,但我可以向您保证,复制源路径确实会将我引导至 .asar 文件。

2:使用 asar 要求创建包。

var fs = require('fs');
var asar = require('asar');

asar.createPackage('C:/Users/redacted/Documents/redacted/node_modules/electron-prebuilt/dist/resources/default_app.asar', 'C:/Users/redacted/Desktop/test.asar', function() {
  console.log('done.');
})

虽然此函数确实记录了正确的“完成”消息,但似乎复制不成功。目标目录中没有显示新文件或文件夹。

提前谢谢大家。

【问题讨论】:

  • windows 目录路径分隔符不是\ 吗?尝试将所有/ 替换为\\ 。或者使用fs.existsSync(yourPath) 来确保Node 可以实际看到它。您甚至可以使用fs.readdir 列出文件夹中的文件。
  • 您的文件路径中没有空格,是吗?
  • 我在路径字符串中的所有空格之前都使用了反斜杠 \。我还尝试将所有 / 替换为 \\ (除了空格),这两种解决方案最终都给出了相同的错误。当我将源路径用作“路径”时,使用 fs.existsSync("path") 返回 true。复制整个档案还有其他建议吗?

标签: node.js fs asar


【解决方案1】:

也许你可以在 fs 模块中禁用对 asar 的支持,像这样:

process.noAsar = true

这是文档:https://electronjs.org/docs/tutorial/application-packaging#treating-an-asar-archive-as-a-normal-file

【讨论】:

    【解决方案2】:

    我最终成功的方法是重命名 .asar 文件,然后在我复制它们后重命名它们。这是我复制 .asar 文件的最终来源:

    var filePathSource = path.join(__dirname, 'default_app.asar')
    var filePathTarget = path.join(__dirname, 'test.txt')
    
    var filePathSourceNew = filePathSource.slice(0, -5) + ".txt";
    console.log(filePathSourceNew);
    
    fs.rename(filePathSource, filePathSourceNew, function(err) {
        if (err) {
          console.log('ERROR: ' + err);
        } else {
          var stream = fs.createReadStream(filePathSourceNew).pipe(fs.createWriteStream(filePathTarget));
          stream.on('finish', function () {
            fs.rename(filePathSourceNew, filePathSource, function(err) {
                if (err) {
                  console.log('ERROR: ' + err);
                } else {
                  fs.rename(filePathTarget, filePathTarget.slice(0, -4) + ".asar", function(err) {
                      if (err) {
                        console.log('ERROR: ' + err);
                      } else {
                        console.log("Complete Asar Copy");
                      }
                  });
                }
            });
          });
        }
    });
    

    【讨论】:

    • 拉了几个小时的头发后,这很有效。谢谢
    • 它是因为 asar 文件在电子中被作为目录处理,对吗?
    【解决方案3】:

    您可以使用NODEJS模块的“path”。

    const path = require('path')
    filePathSource = path.join(__dirname, 'a', 'b', 'c', 'source.asar') 
    filePathTarget = path.join(__dirname, 'a', 'b', 'c', 'target.asar')    
    fs.createReadStream(filePathSource).pipe(fs.createWriteStream(filePathTarget));
    

    【讨论】:

    • 这没有回答问题。问题是问如何复制 .asar 档案。 我已经知道如何创建正确的文件路径。请确保您完整阅读了我的问题。
    • 呃..好吧,我认为有同样的问题。
    • 您的解决方案适用于任何其他文件,但 .asar 文件除外,这是我要解决的问题。我在一个 css 文件上测试了你的解决方案,以确保我的路径没有错误并且它有效。但是更改为我在同一目录中的 asar 文件会导致找不到错误。我相信这是因为 Windows 试图将此存档视为一个目录,但随后失败,因为它实际上是一个文件。关于如何解决这个问题的任何想法?
    • 这和你的问题类似吗? github.com/electron/electron/issues/1676
    • 这帮助我弄清楚我需要做什么才能复制这个档案。我最终用 nodejs fs 重命名存档,然后复制它然后重命名它。
    猜你喜欢
    • 2016-05-04
    • 1970-01-01
    • 2014-04-08
    • 2016-08-10
    • 1970-01-01
    • 1970-01-01
    • 2016-06-29
    • 2021-03-25
    • 1970-01-01
    相关资源
    最近更新 更多