Gio(Gjs) Tips
# 最終更新日 2023.11.19
GFile 基本
GFile は GVFS でのアクセスです、ファイルディスクリプタではありません
//!/usr/bin/gjs -m
import Gio from 'gi://Gio';
// 以下を都合のいいように変更してください
const FILENAME = '新規ファイル.txt';
const CONTENTS = '内容\nです';
const COPYFILE = 'コピー.txt';
// GFile の作成は存在しないファイルでもいい
let f = Gio.file_new_for_path(FILENAME);
// 存在しないことの確認
print(f.query_exists(null));
//=> false
// 新規作成、この関数を呼んだ時点でファイルは作られる
let ostream = f.create(Gio.FileCreateFlags.NONE, null);
// 上書きの場合は replace を使う、実は新規でも使える
// 第二引数を True にすると 新規ファイル.txt~ が自動で作られる
//ostream = f.replace(None, False, Gio.FileCreateFlags.NONE);
// 戻り値の GFileOutputStream を使ってファイル内容を書き込む
// 文字列の場合は UTF-8 に変換するのを忘れずに
ostream.write(CONTENTS, null);
// 閉じる、この後何もしないならガベージコレクションにまかせてもいい
ostream.close(null);
// コピー、詳細不要なら以下でいい
let c = Gio.file_new_for_path(COPYFILE);
f.copy(c, Gio.FileCopyFlags.NONE, null, (current, total)=> {
//
});
// ゴミ箱へ移動
f.trash(null);
// COPYFILE が存在して FILENAME がゴミ箱に入っていることを確認
URI から読み込む
GNOME から https:// や ssh:// や dav:// 等でアクセス可能な URI ならすべて読み込み可能 具体的には下方の「サポートしている URI スキーム列挙」のスキームです 「カメラはやっぱり OM SYSTEM!」と表示できたら成功
#!/usr/bin/gjs -m
import Gio from 'gi://Gio';
let uri = Gio.file_new_for_uri('https://palepoli.skr.jp/tips/gjs/test.dat');
let [ok, contents, etag_out] = uri.load_contents(null);
if (ok) {
let dec = new TextDecoder();
let text = dec.decode(contents);
print(text);
} else {
print('アクセスできません');
}
サポートしている URI スキーム列挙
Gio でアクセスできるスキーム一覧
#!/usr/bin/gjs -m
import Gio from 'gi://Gio';
let vfs = Gio.Vfs.get_default();
let schemes = vfs.get_supported_uri_schemes();
for (let s of schemes) {
print(`${s}://`);
}
ファイルの詳細を得る
query_info の引数は得たい情報のみを記述すればいい
#!/usr/bin/gjs -m
import Gio from 'gi://Gio';
import System from 'system';
// 自身の詳細
let f = Gio.file_new_for_path(System.programInvocationName);
// GFileInfo の引数に得たい項目をコンマ区切りで指定
let info = f.query_info(
'standard::name,standard::content-type,standard::size',
Gio.FileQueryInfoFlags.NONE,
null
);
// 取得
let _name = info.get_name();
let _size = info.get_size();
let _type = info.get_content_type();
let _desc = Gio.content_type_get_description(_type);
// 出力
print(`----------
Name : ${_name}
Size : ${_size} byte
Content Type: ${_type}
Description : ${_desc}
----------`);
/* output
----------
Name : info.js
Size : 819 byte
Content Type: application/javascript
Description : JavaScript プログラム
----------
*/
ディレクトリ内容列挙
ディレクトリや隠しファイルも関係なく取得されます standard::* 指定しないと GFileInfo から確認できませんので注意
#!/usr/bin/gjs -m
import Gio from 'gi://Gio';
// ドット指定ならカレントディレクトリという意味になります
let gFile = Gio.file_new_for_path('.');
let fileEnumerator = gFile.enumerate_children(
'standard::type,standard::is-hidden,standard::is-backup',
Gio.FileQueryInfoFlags.NONE,
null
);
for (;;) {
let info = fileEnumerator.next_file(null);
if (info == null) break;
if (info.get_is_hidden()) continue;
if (info.get_is_backup()) continue;
if (info.get_file_type() == Gio.FileType.DIRECTORY) continue;
print(info.get_name());
}
標準入出力
GIOChannenl と比べると少し面倒
#!/usr/bin/gjs -m
import Gio from 'gi://Gio';
let uostream = new Gio.UnixOutputStream({fd: 0});
let dostream = new Gio.DataOutputStream({base_stream: uostream});
dostream.put_string('何か入力して Enter :', null);
let uistream = new Gio.UnixInputStream({fd: 1});
let distream = new Gio.DataInputStream({base_stream: uistream});
let [txt,] = distream.read_line_utf8(null);
print(`「${txt}」が入力されました`);
Copyright(C) sasakima-nao All rights reserved 2002 --- 2025.