.net column

.NET開発者のためのブログメディア

C#のディレクトリとは?取得方法も紹介!

2020年07月09日
SE
ディレクトリとはどのようなものなのでしょうか?
PM
フォルダと同じ意味があり、ファイルの入れ物のことを言います。取得方法については、この後詳しく見ていきましょう。

C#のディレクトリ取得とは

C#のディレクトリと言われ、ピンと来ない人もいるでしょう。そんな人でも、ディレクトリではなくフォルダと言われれば、わかるのではないでしょうか。ディレクトリもフォルダも意味は同じで、コンピュータ上のファイルの入れ物のことです。

フォルダはWindowsやMacで使用される言葉ですが、C#はWindowsだけでなく全てのプラットフォームで使用することを想定しているため、より古くからあるディレクトリという言葉を使用しています。

今回は、コンピュータ上でC#のディレクトリを取得する方法を解説します。興味がある人は是非ご覧ください。

Directoryクラスでディレクトリ情報を得られる

C#でディレクトリ情報を取得するには、Directoryクラスを使用します。以下のサンプルを見てください。なお、実行する場合はソースの先頭に「using System;using System.IO;」を記述してください。

try
{
string[] files = Directory.GetFiles(“”c:\\test””);
for (int i = 0; i < files.Length; i++)
{
Console.WriteLine(files[i]);
}
}
catch (Exception e)
{
Console.WriteLine(e.Message);
}

“”””で囲まれた文字列の中で、\を\\と2つ記述していますが、これはC#の文字列では\がエスケープという特殊な意味を持つため、2つ連ねる必要があります。

ファイルが見つからなかった場合の対策も必要

Cドライブ直下にtestというディレクトリがあり、中にa.txtとb.txtというファイルがある場合、上のC#のサンプルを実行すると、

c:\test\a.txt
c:\test\b.txt

のように表示されます。もし、testディレクトリが無かったらどうなるのでしょうか。その場合はDirectoryNotFoundExceptionという例外が発生し、その対策が無い場合は、異常終了してしまいます。

ただし、このプログラムでは対策として「try~catch」節があるので、その場合は例外をcatchし、下記のようなメッセージを表示して正常に終了します。

Could not find a part of the path ‘c:\test’.

このように、ファイル処理には、指定されたディレクトリが無かった場合の対策を入れることをおすすめします。

Directoryクラスの様々な機能

C#のDirectoryクラスのGetDirectoriesメソッドで、ディレクトリ名を取得できます。

string[] dirs = Directory.GetDirectories(“”c:\\test””);

GetFileSystemEntriesメソッドでは、ファイルとディレクトリの両方の名前を取得できます。

string[] fses = Directory.GetFileSystemEntries(“”c:\\test””);

EnumerateFilesメソッドでは、指定した条件のファイルだけを取得できます。例えば、testディレクトリ内にa.txtとb.txtとc.pngがあった場合、

var pngs = Directory.EnumerateFiles(“”c:\\test””,””*.png””); // pngファイルのみを取得
foreach(string s in pngs)
{
Console.WriteLine(s);
}

これで、

c:\test\c.png

と表示されます。

カレントディレクトリを取得する

ここまでのディレクトリで表示されていたファイルパスは、どれもCドライブの先頭から表示されています。これを絶対パスと言います。しかし、ディレクトリの階層が深くなることで絶対パスが長くなり、扱いづらくなります。

これを解消するのが相対パスです。相対パスを使用するには、カレントディレクトリを知る必要があります。以下を実行するとカレントディレクトリの場所を取得できます。

Console.WriteLine(Directory.GetCurrentDirectory());

カレントディレクトリとは現在の場所

上のWriteLine文を実行すると、Visual Studioの場合は、以下のような絶対パスが表示されます。

C:\Users\(ユーザ名)\source\repos\(アプリ名)\(アプリ名)\bin\Debug\netcoreapp3.1

ユーザ名やアプリ名は環境によって変わります。これがC#アプリを実行する時のコンピューターのカレントディレクトリです。カレントディレクトリとは、コンピューターが処理を行っている場所を示しています。

カレントディレクトリの移動

カレントディレクトリの移動について説明します。cドライブの直下に、testというディレクトリがあって、その中にsubdirというディレクトリ、その中にsubsubdirがあるとします。以下のような構造になります。

c\test\subdir\subsubdir

以下を実行すると、

Directory.SetCurrentDirectory(“”c:\\test””);
Console.WriteLine(Directory.GetCurrentDirectory());
Directory.SetCurrentDirectory(“”subdir””);
Console.WriteLine(Directory.GetCurrentDirectory());

以下のように表示されます。

c:\test
c:\test\subdir

相対パスはとても便利

上のC#のサンプルでは、SetCurrentDirectoryによってc:\testにカレントディレクトリを移動し、その下のsubdirに移動しています。””subdir””と記述していることに注目してください。これが相対パスになります。カレントディレクトリの位置から見た記述が出来るということです。

なお、これを絶対パスで””c:\\test\\subdir””と記述しても同じ動作はしますが、相対パスの方が簡潔になるでしょう。次に、以下の例を見てください。

Directory.SetCurrentDirectory(“”c:\\test\\subdir””);
Console.WriteLine(Directory.GetCurrentDirectory());
Directory.SetCurrentDirectory(“”..””);
Console.WriteLine(Directory.GetCurrentDirectory());
Directory.SetCurrentDirectory(“”subdir\\subsubdir””);
Console.WriteLine(Directory.GetCurrentDirectory());
Directory.SetCurrentDirectory(“”..\\..\\””);
Console.WriteLine(Directory.GetCurrentDirectory());

..を使えばパスの記述が簡潔になる

上のC#のサンプルを実行すると以下のように表示されます。

c:\test\subdir
c:\test
c:\test\subdir\subsubdir
c:\test

カレントディレクトリをc:\test\subdirに移動、次に一つ上のtestに移動、次にsubdirの下のsubsubdir移動、最後にtestに戻るという流れになります。相対パスの記述の..は一つ上の階層のディレクトリを意味しています。..を使用することでパスの記述がとても短くなります。

.\は省略することが可能

..は上の階層を示すことから、..\\..は2つ上の階層を意味します。そして.は現在の階層を示します。これは省略が可能です。最初に””subdir””としていたのは””.\\subdir””を省略していたのです。

このような相対パスは、ファイルを扱う全てのメソッドで使うことができます。例えば、以下を実行すると、testの下にsubdir2というディレクトリを作成します。

Directory.SetCurrentDirectory(“”c:\\test\\subdir\\subsubdir””);
Directory.CreateDirectory(“”..\\..\\subdir2″”);

相対パスを使うことで、パスの表記がコンパクトになるでしょう。

SE
カレントディレクトリを使うと、情報を得ることが出来るようになるのですね。
PM
カレントディレクトリを理解することで、さまざまな活用方法が出来るようになります。

Directoryクラスと相対パスを活用しよう

C#のディレクトリ取得について説明しましたが、いかがでしたでしょうか。Directoryクラスは、ディレクトリの取得や作成以外にも、移動や削除、ファイルの移動なども行うことができます。この記事を参考に、相対パスを使いこなしてみましょう。


.NET分野でのキャリアアップをお考えの方は、現在募集中の求人情報をご覧ください。

求人一覧

また、直接のエントリーも受け付けております。

エントリー(応募フォーム)