見出し画像

続C言語教室 - 第18回 ファイル操作(2) 階層化ディレクトリ

ファイルというのは元々はひとつのメディアに対して、ズラズラと並ぶものだったのですが、あまりファイルの数が増えてくると、同じ名前を使うことは出来ないので、名前をつけるにも困るようになりますし、何らかのグループ化がしたくなります。※ちなみにメディアごとの識別としてボリューム名という名前が使えることが多かったです。

そこで、ディレクトリという考え方が導入されました。ファイルはいずれかのディレクトリに属す形となり、ディレクトリの中にもディレクトリを作ることも出来ます(階層化ディレクトリ)。メディアごとの最も上位に当たる階層をルートディレクトリ(またはトップディレクトリ)とも呼び、これを起点とした木構造でファイルを管理するようになりました。ディレクトリにはファイルはもちろんディレクトリも置くことが出来、これで「階層化」が実現されています。

階層化ディレクトリ

このような構造にすることで、ファイルをグループ化することが出来ますし、ディレクトリが異なれば同じ名前のファイルも使うことが出来ます。そして特定のファイルを指定するには、ルートディレクトリから順にディレクトリを指定して最後にファイル名を書きます。

/A/G/I

ディレクトリGにあるファイルIを指定する書き方

このように特定のファイルを指定するにはディレクトリを書き連ねるので、このディレクトリのつながりを「パス(PATH)」と呼びます。そしてルートから順に書く場合の指定方法を「フルパス」と表現します。パスに最後のファイル名が入るか入らないかは少しばかり微妙なところなんですが、ファイル名を指定する部分が階層化ディレクトリに対応していることを示すためにファイル名と書かずにパス名と表記していることも多いです(この場合、ファイル名も含まれる)。

基本的にはこれだけなんですが、常にルートから書くのも長くなりがちですし、自分のファイルがあるよりも下の階層だけの指定で済めば、同じプログラムを複数使うときなどに同じ表現で済むので便利です(同じプログラムをディレクトリ1とディレクトリ2に置くと、それぞれのディレクトリ名をきちんと書かなければならない)。そこでルートから始めない表記もあります。

先の図でファイルFからファイルHを指定する時に

/A/G/H と書くのではなく、G/Hとルートで始まらない書き方もできて、これを相対パスと呼びます(ルートから書くのは絶対パス)。こう書いておけばファイルFがディレクトリA以外の場所にあっても、自身のファイルと同じディレクトリにあるディレクトリGの中にファイルHを指定できるわけです。

ところで相対パスを使う時に、自身のディレクトリよりも下の階層であれば困らないのですが、より上位の階層にアクセスする方法がありません。実はルートディレクトリ以外のディレクトリには親ディレクトリを示す”..”というファイルが必ず用意されていることになっています(隠しファイルになっていてファイル一覧のコマンドで表示されないこともある)。これを使うことで親ディレクトリを表すことが出来、上位階層への相対パスが書けるようになっています。

".."は親ディレクトリを指す

ちなみに相対パス表記の場合、行ったり来たりが出来るので、特定のパスへの表現が必ずしもユニークにならずいろいろな書き方が出来てしまいますが、それが問題となるケースはあまり出くわしません。

それから”.”というファイル名もあるのですが、こちらは親ではなく自分自身を指します。どうして自身が必要なのかについては、ファイル名ではなくて相対パスであることを明確にする場合にこれを使って書くことがあります(ディレクトリを書かずにファイル名のみを書いた場合に、特別な意味が出てくることがあります)。

ということで、ディレクトリ操作はOSやデバイスごとのファイルシステムによって異なるものなので、C言語からは標準ライブラリではなくPOSIXで標準化されているライブラリを呼び出すことになります。

#include <sys/types.h>
#include <sys/stat.h>
int mkdir(const char *path, mode_t mode);

ディレクトリ作成

#include <unistd.h>
int rmdir(const char* path);

ディレクトリ削除
(ディレクトリに一般のファイルが存在していると削除できずエラーになります)

さて、ディレクトリには、そこに含まれているファイルまたはディレクトリに関する情報が列挙されているのですが、それを知るためのライブラリ関数も用意されています。この使い方は次回にします。

ディレクトリ

今更ながらファイルやディレクトリ, ファイルパスって何だろう?

ヘッダ画像は、AIで生成しました。

#プログラミング #C言語 #プログラミング講座 #C言語教室 #ファイルシステム #ディレクトリ #階層化ディレクトリ #mkdir #rmdir #パス #絶対パス #相対パス

いいなと思ったら応援しよう!