5

我正在尝试使用 GJS,更准确地说是以同步方式读取文本文件。这是一个用于文件读取的异步函数的示例

gio-cat.js 我发现了如何使用下一个函数继续种子:

function readFile(filename) {
    print(filename);
    var input_file = gio.file_new_for_path(filename);
    var fstream = input_file.read();
    var dstream = new gio.DataInputStream.c_new(fstream);
    var data = dstream.read_until("", 0);
    fstream.close();
    return data;
}

但不幸的是,它不适用于 GJS。谁能帮我 ?

4

4 回答 4

4

GLib 有帮助函数GLib.file_get_contents(String fileName)来同步读取文件:

const GLib = imports.gi.GLib;
//...
let fileContents = String(GLib.file_get_contents("/path/to/yourFile")[1]);
于 2017-01-29T15:18:44.793 回答
1

当我使用 GJS 开发 Cinnamon 小程序时,我曾经使用该get_file_contents_utf8_sync函数来读取文本文件:

const Cinnamon = imports.gi.Cinnamon;

let fileContent = Cinnamon.get_file_contents_utf8_sync("file path");

如果您安装了 Cinnamon 并且您同意使用它,它会回答您的问题。
否则,这里是get_file_contents_utf8_sync函数的 C 代码cinnamon-util.c,希望对您有所帮助:

char * cinnamon_get_file_contents_utf8_sync (const char *path, GError **error)
{
  char *contents;
  gsize len;
  if (!g_file_get_contents (path, &contents, &len, error))
    return NULL;
  if (!g_utf8_validate (contents, len, NULL))
    {
      g_free (contents);
      g_set_error (error,
                   G_IO_ERROR,
                   G_IO_ERROR_FAILED,
                   "File %s contains invalid UTF-8",
                   path);
      return NULL;
    }
  return contents;
}

肉桂源代码

于 2013-04-13T14:09:45.530 回答
1

这是一个仅适用于 Gio 的解决方案。

function readFile(filename) {
    let input_file = Gio.file_new_for_path(filename);
    let size = input_file.query_info(
        "standard::size",
        Gio.FileQueryInfoFlags.NONE,
        null).get_size();
    let stream = input_file.open_readwrite(null).get_input_stream();
    let data = stream.read_bytes(size, null).get_data();
    stream.close(null);
    return data;
}
于 2014-01-15T19:17:52.177 回答
0

尝试更换

new gio.DataInputStream.c_new(fstream);

gio.DataInputStream.new(fstream);

它对我有用

于 2014-11-18T10:34:39.410 回答