ディレクトリの絶対パスと相対パスはどう追う?
基本情報技術者試験 平成29年度春期 午前 問18 / ソフトウェア › ファイルシステム
過去問にチャレンジ
A, Bという名の複数のディレクトリが、図に示す構造で管理されている。“¥B¥A¥B”がカレントディレクトリになるのは、カレントディレクトリをどのように移動した場合か。ここで、ディレクトリの指定は次の方法によるものとし、→は移動の順序を示す。 〔ディレクトリ指定方法〕 (1) ディレクトリは、“ディレクトリ名¥...¥ディレクトリ名”のように、経路上のディレクトリを順に“¥”で区切って並べた後に、“¥”とディレクトリ名を指定する。 (2) カレントディレクトリは、“.”で表す。 (3) 1階層上のディレクトリは、“..”で表す。 (4) 始まりが“¥”のときは、左端にルートディレクトリが省略されているものとする。 (5) 始まりが“¥”、 “.”、 “..”のいずれでもないときは、左端に“.¥”が省略されているものとする。

- ア
¥A → ..¥B → .¥A¥B
- イ
¥B → .¥B¥A → ..¥B
- ウ
¥B → ¥A → ¥B
- エ
¥B¥A → ..¥B
会話形式の解説
講師この問題は、移動するたびに現在地をルートからの経路で書くと追いやすくなります。先頭の記号に注目しましょう。
受験者AとBが何度も出てくるので、名前だけでは同じ場所かどうか分からなくなります。
講師そのとおりです。目標はルート直下のB、その下のA、さらにその下のBです。まず「¥A → ..¥B」の移動を追えますか。
受験者¥Aはルート直下のAです。そこから「..」でルートへ上がり、Bに入るので¥Bになります。
講師合っています。続く「.¥A¥B」の「.」は現在地です。¥BからA、Bの順に下りると、¥B¥A¥Bになり、目標と一致します。
受験者では、最初に¥Bへ行ってから「.¥B¥A」と進む経路は、途中で¥B¥B¥Aになるのですね。
講師はい。最後の「..¥B」で親の¥B¥Bへ上がってからBに入るため、結果は¥B¥B¥Bです。目標では2段目がAですが、この結果ではBです。
受験者「¥B → ¥A → ¥B」は、移動を重ねていても3階層目には行けませんか。
講師どれも先頭が「¥」なので、毎回ルートからたどり直します。最後はルート直下の¥Bです。
受験者最初に¥B¥Aへ行き、「..¥B」と進む場合はどうでしょうか。
講師¥B¥Aの親は¥Bです。そこからBに入るので結果は¥B¥Bとなり、目標とは異なります。
受験者正しいのは、¥Aから親へ上がって¥Bに移り、そこからA、Bと下りる経路ですね。
講師はい。先頭が「¥」ならルートから、「.」や「..」なら現在地から追います。同じ名前のディレクトリは、経路全体で区別してください。
まとめ
正解はアです。¥Aから「..¥B」でルート直下の¥Bへ移り、「.¥A¥B」で¥B¥A¥Bに到達します。ほかの経路は、それぞれ¥B¥B¥B、¥B、¥B¥Bで終わります。移動のたびに現在地をルートからの経路に直すと、同じ名前のディレクトリを取り違えずに済みます。
解答・解説
正解はアです
この問題のテーマ
ルートから始まる絶対パスと、カレントディレクトリを起点にする相対パス(「.」「..」)を順に使ったとき、最後にどのディレクトリにいるかを追う問題です。
解き方の考え方
図はルートの下にA・Bがあり、それぞれの下にもA・B、さらにその下にもA・Bがある3階層の木です。目的の¥B¥A¥Bは、ルート直下のB、その下のA、その下のBを指します。各選択肢で、1回移動するたびにカレントを「¥」で始まる絶対パスに書き直して追います。先頭が「¥」なら直前の位置とは関係なくルートから数えます。「.」や「..」で始まるときは、直前のカレントから下りたり上がったりします。
選択肢ごとの解説
- ○ア ¥A → ..¥B → .¥A¥B最初の¥Aは絶対指定なので、カレントは¥Aになります。次の..¥Bでは、¥Aの親にあたるルートへ一度上がってからBに入るため、カレントは¥Bです。最後の.¥A¥Bは¥Bを起点に、下のA、さらにその下のBへ進むので¥B¥A¥Bとなり、目的のディレクトリと一致します。
- ×イ ¥B → .¥B¥A → ..¥B¥Bに移ったあとの.¥B¥Aは、¥Bの下のBのさらに下のAを指すので、カレントは¥B¥B¥Aになります。最後の..¥Bは、親の¥B¥Bへ上がってからBに入る操作なので、結果は¥B¥B¥Bです。目的の¥B¥A¥Bとは経路の2段目がA・Bで食い違っています。
- ×ウ ¥B → ¥A → ¥B¥B、¥A、¥Bの三つはどれも先頭が「¥」なので、毎回ルートから数え直します。そのため途中の移動は結果に影響せず、最後の¥Bでルート直下のBにいるだけになります。3階層目の¥B¥A¥Bには届きません。
- ×エ ¥B¥A → ..¥B¥B¥Aでカレントは¥B¥Aになります。続く..¥Bでは親の¥Bへ上がってからBに入るので、結果は¥B¥Bです。階層は2段目までしか進まず、目的の¥B¥A¥Bとは異なります。
補足
この図はA・Bという同じ名前があちこちの階層に出てくるため、名前だけを見ると、どこにいるのかを見失いやすくなっています。ディレクトリは名前ではなく、ルートからの経路全体で区別されるものと考えて追ってください。
POINT
- 先頭が「¥」のパスはルートを起点にした絶対指定なので、それより前の移動には左右されません。
- 「..」は1階層上(親ディレクトリ)を表し、「..¥B」は親へ上がってからその下のBに入る操作です。
- 先頭が「¥」「.」「..」のどれでもないパスは「.¥」が省略された相対指定で、カレントから下へたどります。
- 移動を重ねる問題では、1回移動するたびにカレントを絶対パスに書き直すと取り違えを防げます。
