Paepoi

Paepoi » Gjs Tips » Gio(Gjs) Tips

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.