0

ファイルをダウンロードしてディスクに書き込む GTK JavaScript プログラムを作成しています。私のコードは次のようになります。

const Gio = imports.gi.Gio;
const Soup = imports.gi.Soup;

// start an http session to make http requests
let _httpSession = new Soup.SessionAsync();
Soup.Session.prototype.add_feature.call(_httpSession, new Soup.ProxyResolverDefault());

// open the file
let file = Gio.file_new_for_path(path);
let fstream = file.replace(null, false, Gio.FileCreateFlags.NONE, null);

// start the download
let request = Soup.Message.new('GET', url);
request.connect('got_chunk', Lang.bind(this, function(message, chunk){
  // write each chunk to file
  fstream.write(chunk, chunk.length, null);
}));

this._httpSession.queue_message(request, function(_httpSession, message) {
  // close the file
  fstream.close(null);
});

fstream.write() 行でエラーが発生します。

    JS ERROR: !!!   Exception was: Error: Unhandled GType GCancellable unpacking GArgument from Number
    JS ERROR: !!!     message = '"Unhandled GType GCancellable unpacking GArgument from Number"'
    JS ERROR: !!!     fileName = '"./torbrowser-launcher"'
    JS ERROR: !!!     lineNumber = '402'
    JS ERROR: !!!     stack = '"([object _private_Soup_Message],[object _private_Soup_Buffer])@./torbrowser-launcher:402
("2.3.25-2")@./torbrowser-launcher:122
wrapper("2.3.25-2")@/usr/share/gjs-1.0/lang.js:204
("2.3.25-2")@/usr/share/gjs-1.0/lang.js:145
("2.3.25-2")@/usr/share/gjs-1.0/lang.js:239
@./torbrowser-launcher:489
"'

私が見つけることができるこのエラーへの唯一の参照は、このスレッドにあります: https://mail.gnome.org/archives/gnome-shell-list/2012-July/msg00126.html

その人は結局あきらめて、自分のコードを python に移植しました。

「got_chunk」コールバックが渡すものにも混乱しています。チャンク フィールドは Soup.Buffer ( http://www.roojs.com/seed/gir-1.2-gtk-3.0/gjs/Soup.Buffer.html ) です。その長さはchunk.lengthで取得できますが、chunk.dataを印刷しようとすると未定義です。チャンクを印刷すると、[object _private_Soup_Buffer] が印刷されます。

fstream は Gio.FileOutputStream ( http://www.roojs.com/seed/gir-1.2-gtk-3.0/gjs/Gio.FileOutputStream.html ) です。書き込みメソッドは write(String buffer, guint32 count, Cancellable cancellable) で、cancellable はオプションです。奇妙なことに、書き込み行をこれに置き換えても、まったく同じエラーが発生します。

fstream.write('test ', 5, null);
4

1 に答える 1

1

私はまったく同じ問題にぶつかっていました。多くの試行錯誤の後、write()呼び出しに関する 2 つの問題に要約されました。

  1. 使用している書き込み関数のドキュメント ( http://www.roojs.com/seed/gir-1.2-gtk-3.0/gjs/Gio.FileOutputStream.html ) が間違っているようです。書き込みメソッドのシグネチャは(私が知る限り):

    write(String buffer, Cancellable cancellable, guint32 count)

  2. しかし、単に使用fstream.write(chunk, null, chunk.length);すると、ゼロでいっぱいのファイルが書き込まれます。理由はわかりませんが(GJSが基礎となるCライブラリにバインドする方法に関係がありますchunk.get_data()chunk、. つまり、コード内の書き込み呼び出しを次のように置き換えます。

    fstream.write(chunk.get_data(), null, chunk.length);

于 2013-08-29T20:52:27.037 に答える