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 --- 2024.