JXA FileList

今回は JXA でディレクトリ内容列挙でも。
まあ Objective-c での手段は検索で山ほど見つかる、しかも日本語で。
Gjs だと英語しか見つからないのに、まあ macOS と比べてもね。

変換するだけとはいえ落とし穴は幾つかある。

#!/usr/bin/osascript

ObjC.import("Cocoa");

nil = $();

let path = $("~/Desktop").stringByExpandingTildeInPath;
let nsFiles = $.NSFileManager.defaultManager.contentsOfDirectoryAtPathError(path, nil);
//$.NSLog("%@", nsFiles);
let jsFiles = nsFiles.js; // NSArray to JS Array
for (let i=0; i<jsFiles.length; i++) {
    console.log(jsFiles[i].js);
}

nil は null ではない。
そういえばデルヒャァがそうだったなぁ、もう完全に忘れたけど。

NSArray のままではループできない。
こいつの変換も *.js メソッドでイケるのか、なるほど。

次は再起のように中身まで辿っていく手段。

#!/usr/bin/osascript

ObjC.import("Cocoa");

let path = $("~/Documents").stringByExpandingTildeInPath;
let nsDirEnum = $.NSFileManager.defaultManager.enumeratorAtPath(path);
//while (let name = nsDirEnum.nextObject) {
while (true) {
    let name = nsDirEnum.nextObject;
    if (name.isNil()) break;
    let fullPath = path.stringByAppendingPathComponent(name);   // Full Path
    console.log(fullPath.js);
}
console.log("done");

if (name == $()) では認識してくれない。
つまり検索でよく見つかるコメントアウト部分は使えない。
isNil() でなんとか JavaScript の boolean 値だと認識するようだ。

Gjs や PyGObject と違って型が明確に分離している。
ってもソレさえ理解できてしまえば日本語情報があるだけ簡単だね。

どうでもいいけど Gedit は日本語入力できないまま使っている。
開き直って日本語を使わなければいいのさ、ガッハッハ!
まあ JXA 専用だね。