1

electron アプリのファイルシステムにファイルをダウンロードしようとしています。メインスレッドの私のコードは次のようになります。

const dir = `${__dirname}/media`;
if (!fs.existsSync(dir)){
    fs.mkdirSync(dir);
}

const file = fs.createWriteStream(`${dir}/${name}`);
file.on("open", function() {
    const request = http.get(url, function(response) {
        response.pipe(file);

        response.on('end', function() {
            file.close();
            ...
        });
    });

    request.on('error', function(err) {
        ...
    });
});

これは、を使用して開発で実行しているときに機能しますが、electron .でビルドした後electron-builder、アラートでエラーが発生します。

キャッチされない例外: エラー: ENOENT、media/uploads_2016_02_BASF_Holistic_Program.jpg が /Users/nicholasstephan/Desktop/XXXXXXX/dist/Mac/XXXXXX.app/Contents/Resources/app.asar で notFoundError (ELECTRON_ASAR.js:109:19) に見つかりませんObject.module.(無名関数) [as open] (ELECTRON_ASAR.js:209:16) at WriteStream.open (fs.js:1890:6) at new WriteStream (fs.js:1876:10) at Object. fs.createWriteStream (fs.js:1831:10) 次 (/Users/nicholasstephan/Desktop/XXXXXXXX/dist/Mac/XXXXXXXX.app/Contents/Resources/app.asar/media.js:19:18) at /ユーザー/nicholasstephan/Desktop/XXXXXXXX/dist/Mac/XXXXXXXX.app/Contents/Resources/app.asar/media.js:52:4 ...

参照されてmedia.jsいる ln 19 は、コード内のconst file = fs.createWriteStream(${dir}/${name});行です。

他の約12の同様のスタックオーバーフローの回答で提供されているソリューションを試しましたが、問題を解決したものはありません.

何が起きてる?

ありがとう。

4

1 に答える 1

2

ビルドされた Electron アプリは、Asar形式を使用します。Asar はアーカイブ形式 (実際には 1 つの大きなファイルにすぎません) ですが、Electron では、標準のディレクトリであるかのように読み取ることができます。

関数を使用して Asar に書き込むことはできないと思います (明示的に文書化されているのを見たことはありませんが) fs。いずれにせよ、データを書き込むためのより適切な場所がほぼ確実にあります。

別のパスに書き込んでみてください。Electron は、たとえば、アプリの構成ファイルを保持するディレクトリにapp.getPath(name)書き込むことができるように、 を使用して多くの便利なパスを提供します。userData

于 2017-02-28T12:22:56.957 に答える