カナデKanade

13. パスを扱おう

ファイルのパスをつなげたり分けたり整えたりする【パス】モジュールを知りましょう。

この章で学ぶこと

  • パスとは何か、/で書く決まり
  • パスをつなげる、ファイル名・フォルダ・拡張子を取り出す、整える

パスは、ファイルがコンピューターの中のどこにあるかを教える住所です。写真/旅行/海.pngは「写真フォルダの中の旅行フォルダの中にある海.pngファイル」という意味です。フォルダとファイルの名前は/で区切り、ファイル名の最後の.pngのような部分を拡張子といいます。拡張子はファイルの種類を教えてくれます。

【パス】モジュールは、写真/旅行/海.pngのようなパスの文字列を扱います。つなげたり、フォルダ名とファイル名を取り出したり、拡張子を変えたり、..が混ざったパスをきれいに整えたりできます。これらの道具は文字列だけを触り、コンピューターのファイルには触れないので、ブラウザでもそのまま動きます。ファイルを実際に読み書きするのはHanaランタイムの【ファイル】モジュールの役目で、二つを組み合わせると便利です。

道具 できること
〈結合〉(部品, 部品, …) 部品を/でつなぎます(空の部品は飛ばし、/で始まる部品が来たらそこからやり直します)
〈フォルダ名〉(パス) 最後の部品を除いた前の部分を返します(a/b/c.txt → a/b)
〈ファイル名〉(パス) 最後の部品を返します(a/b/c.txt → c.txt、a/b/のように/で終わると空の文字列)
〈拡張子〉(パス) 最後の部品の拡張子をドット付きで返します(c.tar.gz → .gz、.bashrcに拡張子はありません)
〈拡張子なし名〉(パス) 拡張子を除いたファイル名です(c.txt → c)
〈拡張子変更〉(パス, 拡張子) 拡張子を変えます(「md」のようにドットがなくてもよく、「」なら拡張子をなくします)
〈正規化〉(パス) //、.、中/..をたたんできれいにします
〈絶対パスか〉(パス) /(またはC:/)で始まるかを真/偽で教えます
〈構成要素〉(パス) 部品のリストに分けます(絶対パスなら先頭が/です)
【パス】から〈結合〉と〈ファイル名〉と〈フォルダ名〉を持ってこよう
【パス】から〈拡張子〉と〈拡張子なし名〉と〈拡張子変更〉を持ってこよう

『元』を【文字列】の〈結合〉(「写真」, 「旅行」, 「海.png」)にしよう
『元』を出力しよう
〈フォルダ名〉(『元』)を出力しよう
〈ファイル名〉(『元』)を出力しよう
〈拡張子〉(『元』)を出力しよう
〈拡張子なし名〉(『元』)を出力しよう
〈拡張子変更〉(『元』, 「jpg」)を出力しよう

パスを書くルール

  • 部品を区切る文字は/です。Windowsのパスのように\で書いても/として扱い、返すパスはいつも/を使います(Windowsも/を理解します)。
  • 先頭がC:のように英字1文字と:なら、ドライブとして扱います。C:/dataは絶対パスで、C:dataは違います。
  • 道具は、パスが実際に存在するかどうかは確かめません。存在しないフォルダのパスでもいくらでも作れます。

正規化と分割

〈正規化〉は.と//を消して、中/..を打ち消し合わせます。それ以上さかのぼれない相対パスの..は残り、/の真上へ行く..は消えます。全部消えて何も残らないときは.です。

【パス】から〈正規化〉と〈絶対パスか〉と〈構成要素〉を持ってこよう

〈正規化〉(「a//b/./c/../d」)を出力しよう
〈正規化〉(「../a/../..」)を出力しよう
〈正規化〉(「/../a」)を出力しよう
〈正規化〉(「a/..」)を出力しよう

〈絶対パスか〉(「/data/メモ.txt」)を出力しよう
〈絶対パスか〉(「data/メモ.txt」)を出力しよう

〈構成要素〉(「/data/メモ.txt」)を出力しよう
〈構成要素〉(「data/./メモ.txt」)を出力しよう

エラーになるとき

道具ごとに、受け取る値の数と種類が決まっています。〈ファイル名〉(1)のように文字列でない値を渡したり、〈結合〉()のように何も渡さなかったりするとエラーになります。

【ファイル】と一緒に

フォルダの中を順に見て拡張子を変えて移すような、実際のファイルを扱う仕事でこれらの道具が活躍します。【ファイル】はHanaランタイムのドキュメントで見たとおりブラウザでは使えないので、次のようなスクリプトは自分のコンピューターのHanaランタイムで動かしてみてください。

【ファイル】から〈一覧〉と〈移動〉を持ってこよう
【パス】から〈結合〉と〈拡張子〉と〈拡張子変更〉を持ってこよう

『名前たち』を【リスト】の〈一覧〉(「写真」)にしよう
『名前たち』の『名前』ごとに繰り返そう:
    『種類』を〈拡張子〉(『名前』)にしよう
    もし(『種類』と「.png」が同じ)なら:
        〈移動〉(〈結合〉(「写真」, 『名前』), 〈結合〉(「写真」, 〈拡張子変更〉(『名前』, 「jpg」)))を実行しよう

練習問題

1. 「書類/報告書/2026.txt」から、ファイル名、フォルダ、拡張子をそれぞれ出力してみましょう。

答えの例
【パス】から〈ファイル名〉と〈フォルダ名〉と〈拡張子〉を持ってこよう

『パス』を「書類/報告書/2026.txt」にしよう
(〈ファイル名〉(『パス』))を出力しよう
(〈フォルダ名〉(『パス』))を出力しよう
(〈拡張子〉(『パス』))を出力しよう

2. ファイル名のリストの中で、拡張子が.jpgのものだけ、拡張子を.pngに変えた名前を出力してみましょう。

『ファイルたち』を【「海.jpg」, 「メモ.txt」, 「山.jpg」】にしよう
答えの例
【パス】から〈拡張子〉と〈拡張子変更〉を持ってこよう

『ファイルたち』を【「海.jpg」, 「メモ.txt」, 「山.jpg」】にしよう
『ファイルたち』の『名前』ごとに繰り返そう:
    もし(〈拡張子〉(『名前』)が「.jpg」と同じだ)なら:
        (〈拡張子変更〉(『名前』, 「png」))を出力しよう

次の章では、ここまで学んだことを集めて、小さなプログラムを一から作ってみます。

プレイグラウンド
結果
コードを書いて「実行」ボタンを押してください。