
コンピュータにおいて、ディレクトリとは、他のコンピュータファイル、場合によっては他のディレクトリへの参照を含むファイルシステムのカタログ構造です。多くのコンピュータでは、ディレクトリはフォルダーまたはドロワーと呼ばれ、作業台や従来のオフィスのファイルキャビネットに相当します。 [ 1 ]この名前は、特定の地域に住むすべての人々の電話番号を一覧にした電話帳のような本に由来しています。
ファイルは、関連するファイルを同じディレクトリに格納することで整理されます。階層型ファイルシステム(つまり、ファイルとディレクトリがツリー状に整理されているファイルシステム)では、別のディレクトリ内に含まれるディレクトリをサブディレクトリと呼びます。サブディレクトリと、それが格納されているディレクトリ(親ディレクトリ)との関係を表すのに、 「親」と「子」という用語がよく使われます。このようなファイルシステムにおいて、親ディレクトリを持たない最上位のディレクトリは、ルートディレクトリと呼ばれます。
多くのUnix ライクなシステム(GNOME、KDE Plasma 5、ROX Desktop をデスクトップ環境として使用するシステムを含むが、これらに限定されない)内のディレクトリのfreedesktop.orgメディアタイプは「inode/directory」です。[ 2 ]これはIANA に登録されたメディア タイプではありません。

歴史的に、そして一部の最新の組み込みシステムにおいても、ファイルシステムはディレクトリを全くサポートしていなかったか、あるいは「フラット」なディレクトリ構造しか持っていませんでした。つまり、サブディレクトリはサポートされておらず、ファイルを含む最上位ディレクトリのグループのみが存在していました。現代のシステムでは、ディレクトリにはファイルとサブディレクトリが混在して含まれるようになりました。
ディレクトリシステム内の場所への参照をパスと呼びます。
多くのオペレーティングシステムでは、プログラムには実行環境となる作業ディレクトリが関連付けられています。通常、プログラムがアクセスするファイル名に明示的なディレクトリ名が指定されていない場合、それらのファイル名はこのディレクトリ内に存在するものとみなされます。
一部のオペレーティングシステムでは、ユーザーのアクセスをホームディレクトリまたはプロジェクトディレクトリのみに制限することで、他のすべてのユーザーからユーザーの活動を隔離します。初期のUnixでは、ルートディレクトリはルートユーザーのホームディレクトリでしたが、現代のUnixでは通常、 /rootなどの別のディレクトリがこの目的で使用されます。
Unix の理念に従い、Unix システムはディレクトリをファイルの一種として扱います。[ 3 ]ただし、ディレクトリ内のファイルシステム オブジェクトの作成、名前変更、削除によって間接的に行う場合を除き、ディレクトリ ファイルへの書き込みはできません。また、ディレクトリ ファイルからの読み取りは、バイト ストリームではなくレコードを返すディレクトリ固有のライブラリ ルーチンとシステムコールを使用してのみ可能です。 [ 4 ]

オフィスで使用されるファイルフォルダに類似した名前のフォルダは、 1958年に発行された電子記録機会計(ERMA)Mark 1 [ 5 ]やXerox Star [ 6 ]の階層型ファイルシステム設計で使用され、現代のほとんどすべてのオペレーティングシステムのデスクトップ環境で使用されています。フォルダは、物理的なファイルフォルダに視覚的に似たアイコンで表示されることがよくあります。
ファイルシステムの概念である「ディレクトリ」と、それを表現するために使用されるグラフィカルユーザーインターフェイスのメタファー(「フォルダ」)には違いがあります。 たとえば、Microsoft Windows では、特別なフォルダの概念を使用して、コンピュータの内容をユーザーに比較的一貫した方法で表示します。これにより、ユーザーは Windows のバージョンや個々のインストール間で異なる可能性のある絶対ディレクトリパスを扱う必要がなくなります。多くのオペレーティングシステムには、ファイルシステム検索やその他の操作の結果を反映する「スマートフォルダ」または仮想フォルダの概念もあります。これらのフォルダは、ファイル階層内のディレクトリを表すものではありません。多くのメールクライアントでは、メールを整理するためにフォルダを作成できます。これらのフォルダは、ファイルシステム構造に対応する表現を持ちません。
文書のコンテナを指す場合は、「フォルダ」という用語の方が適切です。 「ディレクトリ」という用語は、文書ファイルやフォルダの構造化されたリストがコンピュータに保存される方法を指します。この違いは、ディレクトリへのアクセス方法によって生じる場合があります。Unix システムでは、コマンドラインコンソールで表示する場合、 /usr/bin/は通常ディレクトリと呼ばれますが、グラフィカルなファイルマネージャを介してアクセスする場合は、ユーザーはそれをフォルダと呼ぶことがあります。
階層型ファイルシステムをサポートするオペレーティングシステムは、ファイルパスの解決を高速化するために、 RAMにキャッシュ機能を実装しています。この仕組みにより、パス名をinode参照に解決するためにファイルシステム階層を繰り返し走査する際に伴うオーバーヘッドが軽減されます。
Unix系システムでは、これはディレクトリ名ルックアップキャッシュ(DNLC)、ディレクトリエントリキャッシュ、またはdcacheと呼ばれることがあります。[ 7 ] [ 8 ]
ディレクトリ検索キャッシュは、絶対パスまたは相対パスの構成要素(例:`/usr/bin`)と、それに対応するinodeまたはディレクトリエントリオブジェクトとのマッピングを保存します。これにより、システムは頻繁にアクセスされるファイルやディレクトリに対して完全なパス走査を省略できるため、メタデータ操作が多いワークロードのパフォーマンスが大幅に向上します。
キャッシュは通常、ハッシュテーブルや基数木などの高速な検索構造を使用して実装され、キャッシュの削除にはLRUなどのエイジングアルゴリズムが利用される場合があります。
SunOSはNFSの実装の一部としてルックアップキャッシュを導入しましたが[ 7 ]、NFSだけでなく、Linux、BSD、Solaris、macOSなどのシステムにも採用され、拡張されています。
Windowsは、NTFSおよびカーネルオブジェクトマネージャ層の一部として内部パスキャッシュ機構を使用していますが、これらは必ずしも直接公開されているわけではありません。
FreeBSD、NetBSD、[ 9 ] OpenBSD、[ 10 ] DragonFly BSDを含む BSD の派生版は、ディレクトリ検索キャッシュを実装しています。
Linuxカーネルの仮想ファイルシステム(VFS)レイヤーは、ディレクトリエントリオブジェクト(削除)をキャッシュするためにdcacheと呼ばれる構造体を使用します。各dentryはinodeにリンクされ、ファイルまたはサブディレクトリを表すことができます。これらのdentryはディレクトリ階層を反映したツリー構造で構成され、メモリ負荷がかかっていない限りメモリに格納されます。
ファイル検索の高速化に加え、dcache は、オーバーレイやバインドマウントなどの複雑な構成を含む、マウントされたファイルシステム全体で一貫性を維持する役割も果たします。
NFSやAFSのような分散ファイルシステムでは、キャッシュは複数のクライアント間で一貫性を保つ必要があります。このようなシステムでは、あるクライアントで行われた変更が他のクライアントのルックアップキャッシュに反映されなければなりません。これを実現するために、ネットワークファイルシステムはさまざまなメカニズムを使用します。
整合性を確保できない場合、ファイルメタデータが古くなったり、パス解決が正しく行われなかったりして、アプリケーションエラーやデータ損失につながる可能性があります。
最適化されたディレクトリ検索キャッシュは、`open()`、`stat()`、`execve()`などのファイル操作におけるシステムコールのレイテンシを大幅に削減できます。ベンチマークテストでは、積極的なdentryキャッシュを備えたシステムにおいて、大規模なコードベースへのアクセス時間とシステム起動時間が桁違いに改善されることが示されています。
はディスク名または場所、および指定されたファイルにつながるすべてのドロワーを指定します。