ディレクトリとは、コンピュータ上で個々のデータを分類および整理するための、階層構造(ツリー構造)を持った場所の概念である。
オペレーティングシステム(OS)のほとんどは、個々の電子データをファイルという単位で格納することで、一つの単位として扱う。それらのファイルを、ルートと呼ばれるトップレベルの場所から、階層型に分類された下位構造の適切な場所に配置して整理するという考え方を採用している。ディレクトリは、そのような階層的に分類された場所のことである。
ディレクトリは、OS上でどのように永続的なデータを管理するかという方法を決定しているファイルシステムの要素の一部を成している。もともと、ハードディスクなどの生の装置のレベルでは、セクタという物理的な単位でデータが扱われている。しかし、アプリケーションから見た場合、これは低レベル過ぎて扱いづらい。そこで、OSはよりアプリケーションのロジックに近いデータの格納とアクセスの手段として、ファイルシステムを提供している。
どのような種類のデータをどこに置くべきかということは、OSごとに作法が決まっていることが多い。例えば、Linuxディストリビューションの一つであるCentOSなどでは、Web用の公開ファイルを置く場所は/var/www/htmlなどとなっている。この場所は、OSあるいはディストリビューションが違えば、変わることがある。またWindowsでは、インストーラからインストールされるアプリケーションの位置は、C:\Program Files以下となっている。
ディレクトリ階層の中で、ユーザーが現在参照しているディレクトリは、カレントディレクトリと呼ばれる。あるディレクトリの上のディレクトリは親ディレクトリなどと呼ばれ、下位のディレクトリが子ディレクトリあるいはサブディレクトリなどと呼ばれる。
ディレクトリの任意の場所を参照する機能として、Windowsではエクスプローラ、Mac OSではファインダーが用意されている。WindowsやMac OSはグラフィカルユーザーインターフェース(GUI)が採用されているため、アイコンをクリックする操作によって任意のディレクトリへアクセスすることができる。また、キャラクターユーザーインターフェース(CUI)のOSの場合は、コマンドライン入力で命令することによりディレクトリの移動が可能である。特に指定すれば階層を飛び越して直接アクセスすることもできる。
ディレクトリの考え方は、UNIX系OSにより普及したと言える。WindowsやMacintoshも、同様の思想で作られている。
ディレクトリと似た概念としてフォルダという概念がある。ディレクトリとフォルダの違いとしては下記の点が指摘できる。すなわち、ディレクトリがより物理的な構造に近い意味で使用されるのに対して、フォルダは、利用者に近いメタファーの一部として用いられることが多い。
ちなみに、ディレクトリサービスは、ネットワーク上の分散処理環境において、さまざまなサービスに関する情報を一元管理して提供するサービスや、あるいは、インターネット上でホームページ情報を紹介する電話帳のようなサービスを指す表現である。
構文
解説Directory クラスは、ディレクトリのコピー、移動、名前変更、作成、削除などの一般的な操作に使用します。Directory クラスは、ディレクトリに対する作成、アクセス、および書き込み操作についての DateTime 情報の取得および設定にも使用できます。
Directory のメソッドはすべて静的であるため、1 つの操作を実行するだけであれば、Directory のメソッドを使用する方が、対応する DirectoryInfo のインスタンス メソッドを使用するよりも効率的な場合があります。Directory のメソッドのほとんどは、操作対象のディレクトリのパスを必要とします。
Directory クラスの静的メソッドは、すべてのメソッドでセキュリティ チェックを実行します。オブジェクトを何回か再利用する場合は、このようなセキュリティ チェックが必ずしも必要ではなくなるため、これらの静的メソッドの代わりに DirectoryInfo の対応するインスタンス メソッドを使用することを検討してください。
メモ |
|---|
| 入力文字列としてパスを受け入れるメンバでは、そのパスが正しい書式である必要があります。それ以外の場合は、例外が発生します。たとえば、パスが絶対パスであっても空白で始まっている場合、そのパスはクラスのメソッドではトリムされません。このため、パスが正しい書式にならず、例外が発生します。同様に、1 つのパスまたは複数のパスの組み合わせを絶対パスとして 2 度指定することはできません。たとえば、"c:\temp c:\windows" でも、ほとんどの場合において例外が発生します。パス文字列を受け入れるメソッドを使用するときは、パスが適切な書式であることを確認します。 |
パスを受け入れるメンバでは、ファイルまたはディレクトリを参照するパスを指定できます。指定するパスは、相対パス、またはサーバーおよび共有名を示す UNC (Universal Naming Convention) パスにすることができます。たとえば、次に示すパスはすべて有効なパスです。
C# では "c:\\MyDir"、Visual Basic では "c:\MyDir"。
C# では "MyDir\\MySubdir"、Visual Basic では "MyDir\MySubDir"。
C# では "\\\\MyServer\\MyShare"、Visual Basic では "\\MyServer\MyShare"。
既定では、すべてのユーザーに、新しいディレクトリに対する完全な読み書きアクセス権が与えられます。パス文字列がディレクトリの区切り記号で終わるディレクトリに対するアクセス許可を要求すると、結果として、そのディレクトリに含まれるすべてのサブディレクトリに対するアクセス許可を要求することになります ("C:\Temp\" など)。特定のディレクトリに対するアクセス許可のみが必要な場合は、文字列を "." 文字で終わらせる必要があります ("C:\Temp\." など)。
その他の一般的な I/O タスクまたは関連する I/O タスクの例を次の表に示します。
| Directory.Move DirectoryInfo.MoveTo | |
| Directory.Delete DirectoryInfo.Delete | |
| CreateDirectory Directory | |
| CreateSubdirectory | |
| GetDirectories GetDirectories | |
| GetFileSystemInfos | |
| Directory | |
| GetFileSystemInfos | |
使用例指定したディレクトリが存在するかどうかを判断して、存在する場合はそれを削除し、存在しない場合はそれを作成するコード例を次に示します。この例では、この後にディレクトリを移動し、ディレクトリ内にファイルを作成し、ディレクトリ内のファイルの数をカウントします。
Imports System Imports System.IO Public Class Test Public Shared Sub Main() 'Specify the directories you want to manipulate. Dim path As String = "c:\MyDir" Dim target As String = "c:\TestDir" Try ' Determine whethers the directory exists. If Directory.Exists(path) = False Then ' Create the directory. Directory.CreateDirectory(path) End If If Directory.Exists(target) Then ' Delete the target to ensure it is not there. Directory.Delete(target, True) End If ' Move the directory. Directory.Move(path, target) 'Create a file in the directory. File.CreateText(target + "\myfile.txt") 'Count the files in the target. Console.WriteLine("The number of files in {0} is {1}", _ target, Directory.GetFiles(target).Length) Catch e As Exception Console.WriteLine("The process failed: {0}", e.ToString()) End Try End Sub End Class
using System; using System.IO; class Test { public static void Main() { // Specify the directories you want to manipulate. string path = @"c:\MyDir"; string target = @"c:\TestDir"; try { // Determine whether the directory exists. if (!Directory.Exists(path)) { // Create the directory it does not exist. Directory.CreateDirectory(path); } if (Directory.Exists(target)) { // Delete the target to ensure it is not there. Directory.Delete(target, true); } // Move the directory. Directory.Move(path, target); // Create a file in the directory. File.CreateText(target + @"\myfile.txt"); // Count the files in the target directory. Console.WriteLine("The number of files in {0} is {1}", target, Directory.GetFiles(target).Length); } catch (Exception e) { Console.WriteLine("The process failed: {0}", e.ToString()); } finally {} } }
using namespace System; using namespace System::IO; int main() { // Specify the directories you want to manipulate. String^ path = "c:\\MyDir"; String^ target = "c:\\TestDir"; try { // Determine whether the directory exists. if ( !Directory::Exists( path ) ) { // Create the directory it does not exist. Directory::CreateDirectory( path ); } if ( Directory::Exists( target ) ) { // Delete the target to ensure it is not there. Directory::Delete( target, true ); } // Move the directory. Directory::Move( path, target ); // Create a file in the directory. File::CreateText( String::Concat( target, "\\myfile.txt" ) ); // Count the files in the target directory. Console::WriteLine( "The number of files in {0} is {1}", target, Directory::GetFiles( target )->Length ); } catch ( Exception^ e ) { Console::WriteLine( "The process failed: {0}", e ); } }
import System.*; import System.IO.*; class Test { public static void main(String[] args) { // Specify the directories you want to manipulate. String path = "c:\\MyDir"; String target = "c:\\TestDir"; try { // Determine whether the directory exists. if (!(Directory.Exists(path))) { // Create the directory it does not exist. Directory.CreateDirectory(path); } if (Directory.Exists(target)) { // Delete the target to ensure it is not there. Directory.Delete(target, true); } // Move the directory. Directory.Move(path, target); // Create a file in the directory. File.CreateText(target + "\\myfile.txt"); // Count the files in the target directory. Console.WriteLine("The number of files in {0} is {1}", target, (Int32)Directory.GetFiles(target).length); } catch (System.Exception e) { Console.WriteLine("The process failed: {0}", e.ToString()); } finally { } } //main } //Test
ディレクトリのサイズを計算する方法のコード例を次に示します。
' The following example calculates the size of a directory ' and its subdirectories, if any, and displays the total size ' in bytes. Imports System Imports System.IO Imports Microsoft.VisualBasic Public Class ShowDirSize Public Shared Function DirSize(ByVal d As DirectoryInfo) As Long Dim Size As Long = 0 ' Add file sizes. Dim fis As FileInfo() = d.GetFiles() Dim fi As FileInfo For Each fi In fis Size += fi.Length Next fi ' Add subdirectory sizes. Dim dis As DirectoryInfo() = d.GetDirectories() Dim di As DirectoryInfo For Each di In dis Size += DirSize(di) Next di Return Size End Function 'DirSize Public Overloads Shared Sub Main(ByVal args() As String) If args.Length <> 1 Then Console.WriteLine("You must provide a directory argument at the command line.") Else Dim d As New DirectoryInfo(args(0)) Console.WriteLine("The size of {0} and its subdirectories is {1} bytes.", d, DirSize(d)) End If End Sub 'Main End Class 'ShowDirSize
// The following example calculates the size of a directory // and its subdirectories, if any, and displays the total size // in bytes. using System; using System.IO; public class ShowDirSize { public static long DirSize(DirectoryInfo d) { long Size = 0; // Add file sizes. FileInfo[] fis = d.GetFiles(); foreach (FileInfo fi in fis) { Size += fi.Length; } // Add subdirectory sizes. DirectoryInfo[] dis = d.GetDirectories(); foreach (DirectoryInfo di in dis) { Size += DirSize(di); } return(Size); } public static void Main(string[] args) { if (args.Length != 1) { Console.WriteLine("You must provide a directory argument at the command line."); } else { DirectoryInfo d = new DirectoryInfo(args[0]); Console.WriteLine("The size of {0} and its subdirectories is {1} bytes.", d, DirSize(d)); } } }
// The following example calculates the size of a directory // and its subdirectories, if any, and displays the total size // in bytes. using namespace System; using namespace System::IO; long DirSize( DirectoryInfo^ d ) { long Size = 0; // Add file sizes. array<FileInfo^>^fis = d->GetFiles(); System::Collections::IEnumerator^ myEnum = fis->GetEnumerator(); while ( myEnum->MoveNext() ) { FileInfo^ fi = safe_cast<FileInfo^>(myEnum->Current); Size += (long)fi->Length; } array<DirectoryInfo^>^dis = d->GetDirectories(); while ( myEnum->MoveNext() ) { DirectoryInfo^ di = safe_cast<DirectoryInfo^>(myEnum->Current); Size += DirSize( di ); } return Size; } int main() { array<String^>^args = Environment::GetCommandLineArgs(); if ( args->Length != 2 ) { Console::WriteLine( "You must provide a directory argument at the command line." ); } else { DirectoryInfo^ d = gcnew DirectoryInfo( args[ 1 ] ); Console::WriteLine( "The size of {0} and its subdirectories is {1} bytes.", d, DirSize( d ) ); } }
継承階層
スレッド セーフ
プラットフォームWindows 98, Windows 2000 SP4, Windows CE, Windows Millennium Edition, Windows Mobile for Pocket PC, Windows Mobile for Smartphone, Windows Server 2003, Windows XP Media Center Edition, Windows XP Professional x64 Edition, Windows XP SP2, Windows XP Starter Edition
開発プラットフォームの中には、.NET Framework によってサポートされていないバージョンがあります。サポートされているバージョンについては、「システム要件」を参照してください。
バージョン情報
参照
パブリック メソッド
参照ディレクトリやサブディレクトリを通じて、作成、移動、および列挙するための静的メソッドを公開します。このクラスは継承できません。
Directory データ型で公開されるメンバを以下の表に示します。
パブリック メソッド
参照(Directory から転送)
出典: フリー百科事典『ウィキペディア(Wikipedia)』 (2026/01/01 15:57 UTC 版)
|
|
この記事には複数の問題があります。
|
ディレクトリ(英: directory)は、コンピュータのファイルシステムにおいて、ファイルをグループ化するための特殊なファイル[注釈 1]で、整理・管理などの目的で活用される。ディレクトリの中にも、通常のファイルだけでなく入れ子的にディレクトリを作って、任意の階層を持たせて管理できることがほとんどである。
ファイルの入れ物(容器)などとも表現され、GUIでは文具のフォルダー(folder)のようなメタファーで表現されることが多い。このフォルダーはディレクトリと内部的に同じである場合もあれば、そうでない場合もある。
UnixやDOS、バージョン3.1以前のWindowsなどでは「ディレクトリ」と呼び、Mac OSやiOSやAndroidなどでは「フォルダ」と呼んでいる。Windows 95以降のエクスプローラーでは仮想的な階層構造であるシェル名前空間が導入され、GUI上はフォルダ(フォルダー)[注釈 2]と呼称するようになったが、ディレクトリと完全に同義ではない。例えば、コントロールパネルやネットワーク、圧縮フォルダーなどは、ファイルシステム上のディレクトリとは異なる仮想的なフォルダーである[1]。GoogleドライブやOneDriveのようなオンラインストレージサービスにもフォルダ(フォルダー)の概念がある。
Unixなどでは唯一の最上位の根幹(ルート、ルートディレクトリ)があり、ストレージやボリューム(パーティションなど)の内容は、任意の枝(マウントポイント)にマウント(接ぎ木)される、というツリー(木)モデルとなっている。それに対し、DOSおよびWindowsでは、最上位は「ドライブ」という単位であり[注釈 3]、各ドライブに対してそれぞれのメディアのルートディレクトリがあって、それぞれのツリーがある、という(数学では「林」あるいは「森」と呼んで、「木」と区別することがある)ようなモデルとなっている。
ディレクトリにより任意の深さの[注釈 4]階層を構成することが可能なシステムでは、システムコール上のファイルの指定を、カレントディレクトリ(後述)の移動とファイルの指定のようにして別々に行わなければならないシステムもあるが、Unixなど多くのように「ディレクトリ名/ディレクトリ名/ディレクトリ名/ファイル名」のようにセパレータ(分離符、区切り文字)で分離する表現により一度に行えるものもある。セパレータは、Unixでは '/'(スラッシュ)、DOSやWindowsでは '\'(コードが 0x5C の文字)[注釈 5]である。なお、DOSのセパレータは、内部的にはスラッシュへの切り替えにも対応していた[2]。Windowsでは、多くの場面でセパレータとして0x5Cの代わりにスラッシュも使うことができるが、APIによってはスラッシュに対応しておらず、0x5Cのみを受け付けるものもある。
(セパレータが使えるシステムでは)先頭をセパレータで始めるなどの方法により、ルートディレクトリからの絶対的な表現で指定したパスを「絶対パス」や「フルパス」と呼ぶ。それに対して、カレントディレクトリ(後述)など、なんらかの任意のディレクトリから相対的に指定することもできる。これを「相対パス」と呼ぶ。例えばnote.txtや../2024-04/note.txtなどが相対パスである。相対パスは特に注意深く扱う必要がある。ユーザーから与えられたパスを無害化する処理を施しておかないと、ディレクトリトラバーサルなどの攻撃を許すセキュリティホール(セキュリティ脆弱性)を簡単に生み出してしまう。
Unixなどでは[注釈 6]、プロセスの持つ属性として、カレントディレクトリ(あるいはワーキングディレクトリ)がある。そのプロセスが発行するシステムコール中において、相対パスで指定された場合の起点としてなど「デフォルトのディレクトリ」として使われる。子プロセスの起動時には、その時点での親プロセスのカレントディレクトリが引き継がれるか、明示的に指定することができるものもある。原則として子プロセスは親プロセスに影響を与えることができないため、「シェルのカレントディレクトリを変更する」というコマンドは外部コマンドとして実装することができないので、必ずシェルの内部コマンドとして実装される。
Unixにはディレクトリの内容を表示する外部コマンドとして ls コマンドがあり、Domain/OSには、相当するコマンドとして ldがある。なお、DOSのCOMMAND.COMには、相当する機能を持つ内部コマンド dir[3] があり、DISK-BASICには、相当するコマンドとしてfilesとlfilesがある。
Unixなどでは、ユーザーごとにホームディレクトリが設定されており(passwdファイルなどで)、そのユーザーのログイン後の最初のプロセス(通常はシェル)の初期カレントディレクトリがそれになる。通常[注釈 7]、そのユーザーが所有者かつ読み書き可能に設定されており、その下にユーザー個人のファイルを置くことが多い。
Unixをはじめ多くのシステムでは、ディレクトリ中のファイル名(正確には、「ディレクトリエントリ」)の順番をユーザーが編集することはできない[注釈 8]が、DOSでは比較的容易に直接ディスクの内容を改変して編集[注釈 9]できたため、FDやマイクロデータの「エコロジー」シリーズなど、そのような編集機能を持つファイル管理ソフトもあった。
商用UNIXや、FreeBSDなどいわゆるBSD系のシステムでは、GNU/Linuxにおけるcoreutilsに相当するような基本的なユーティリティ類は全て、カーネルと同じプロジェクトとして維持管理されているいわゆるベースシステムに含まれており、通常は各システムのデフォルトの配置が使用されるため問題が起きることは少ないが、GNU/Linuxでは以前はディストリビューションごとにまちまちであったために面倒な作業などが必要になることがあったため、Filesystem Hierarchy Standard (FHS) により標準化が図られている。
プラットフォームごとにディレクトリを扱うためのシステムコールやAPIが用意されている。代表的なものには大別してPOSIXとWindows APIがあり、C言語互換のインタフェースを持つ関数として提供されている。OSのシェルやシステムコマンドもこれらの上に構築されており、その動作はシステムコールやAPIの仕様の影響を少なからず受けている。
Javaや.NETなどの標準クラスライブラリにおけるディレクトリ操作APIは内部でこれらを使用して実装されている。Pythonのような動的言語のライブラリも同様である。
mkdir()rmdir()opendir()fdopendir()readdir()readdir_r()rewinddir()closedir()ディレクトリを作成する場合は、mkdir()を使う。
ディレクトリを削除する場合は、rmdir()を使うが、中身が空である必要がある。
ディレクトリ内にある項目を列挙する場合は、opendir()にディレクトリのパス文字列を渡して生成したDIRオブジェクトを使い、readdir()で列挙していく[4]。使い終わったDIRオブジェクトはclosedir()で破棄する。
もともとreaddir()は、呼び出しのたびに上書きされる静的な内部バッファへのポインタを返していたため、スレッドセーフではなかった。readdir_r()は引数経由でユーザー提供のバッファに対して値を書き込むことでスレッドセーフ性(再入可能性)を追加した関数だが、呼び出し側によってバッファサイズを指定することができず、ファイル名を保持するのに十分なバッファを確実に割り当てる方法がないという設計欠陥をかかえていた。そのため、IEEE 1003.1-2024 Issue 8ではreaddir_r()は廃止予定(obsolescent)となり、代わりにreaddir()は(単一のディレクトリストリームに対して異なるスレッドからの同時並行的な呼び出しがない限り)スレッドセーフであることが要求されるようになっている[5]。
fdopendir()はファイル記述子に対応したバージョンである。
seekdir()やtelldir()といった拡張 (XSI) をサポートしている実装もある。
CreateDirectory()RemoveDirectory()FindFirstFile()FindNextFile()FindClose()ディレクトリを作成する場合は、CreateDirectory()を使う。
ディレクトリを削除する場合は、RemoveDirectory()を使うが、中身が空である必要がある。
ディレクトリ内にある項目を列挙する場合は、FindFirstFile()にディレクトリのパス文字列を渡して生成したHANDLEオブジェクトを使い、FindNextFile()で列挙していく[6]。使い終わったHANDLEオブジェクトはFindClose()で破棄する。
他にも、Windowsのバージョンによっては、ディレクトリ階層を一度の呼び出しで作成するSHCreateDirectoryEx()[7]、ログインユーザーのホームディレクトリやデスクトップなどのよく使われる特殊なフォルダーのパスを取得するSHGetKnownFolderPath()[8][注釈 10]といった上位のシェルAPIもサポートしている。
GUIで表現されるディレクトリ(フォルダー)のアイコンは、絵文字としてUnicodeに収録されている。なお、U+1F4C1とU+1F4C2の2つはUnicode 6.0で、U+1F5BF、U+1F5C0、U+1F5C1の3つはUnicode 7.0で追加されたものである。
| 記号 | Unicode | JIS X 0213 | 文字参照 | 名称 |
|---|---|---|---|---|
| 📁 | U+1F4C1 |
- |
📁📁 |
FILE FOLDER |
| 📂 | U+1F4C2 |
- |
📂📂 |
OPEN FILE FOLDER |
| 🖿 | U+1F5BF |
- |
🖿🖿 |
BLACK FOLDER |
| 🗀 | U+1F5C0 |
- |
🗀🗀 |
FOLDER |
| 🗁 | U+1F5C1 |
- |
🗁🗁 |
OPEN FOLDER |
SHGetSpecialFolderPath()[9]およびSHGetFolderPath()[10]の後継であり、Microsoft Windows Vista以降で実装されている。 |
この節には参考文献や外部リンクの一覧が含まれていますが、脚注による参照が不十分であるため、情報源が依然不明確です。
|