C#のディレクトリとは?取得方法も紹介!
- システム
エンジニア - ディレクトリとはどのようなものなのでしょうか?
- プロジェクト
マネージャー - フォルダと同じ意味があり、ファイルの入れ物のことを言います。取得方法については、この後詳しく見ていきましょう。
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”);
相対パスを使うことで、パスの表記がコンパクトになるでしょう。
- システム
エンジニア - カレントディレクトリを使うと、情報を得ることが出来るようになるのですね。
- プロジェクト
マネージャー - カレントディレクトリを理解することで、さまざまな活用方法が出来るようになります。
Directoryクラスと相対パスを活用しよう
C#のディレクトリ取得について説明しましたが、いかがでしたでしょうか。Directoryクラスは、ディレクトリの取得や作成以外にも、移動や削除、ファイルの移動なども行うことができます。この記事を参考に、相対パスを使いこなしてみましょう。
FEnet.NETナビ・.NETコラムは株式会社オープンアップシステムが運営しています。
株式会社オープンアップシステムはこんな会社です
秋葉原オフィスには株式会社オープンアップシステムをはじめグループのIT企業が集結!
数多くのエンジニアが集まります。
-
スマホアプリから業務系システムまで
スマホアプリから業務系システムまで開発案件多数。システムエンジニア・プログラマーとしての多彩なキャリアパスがあります。
-
充実した研修制度
毎年、IT技術のトレンドや社員の要望に合わせて、カリキュラムを刷新し展開しています。社内講師の丁寧なサポートを受けながら、自分のペースで学ぶことができます。
-
資格取得を応援
スキルアップしたい社員を応援するために資格取得一時金制度を設けています。受験料(実費)と合わせて資格レベルに合わせた最大10万円の一時金も支給しています。
-
東証プライム上場企業グループ
オープンアップシステムは東証プライム上場「株式会社オープンアップグループ」のグループ企業です。
安定した経営基盤とグループ間のスムーズな連携でコロナ禍でも安定した雇用を実現させています。
株式会社オープンアップシステムに興味を持った方へ
株式会社オープンアップシステムでは、開発系エンジニア・プログラマを募集しています。
年収をアップしたい!スキルアップしたい!大手の上流案件にチャレンジしたい!
まずは話だけでも聞いてみたい場合もOK。お気軽にご登録ください。
C#新着案件New Job
-
システム開発/東京都新宿区/【WEB面談可/C#経験者/20代前半の方活躍中/経験1年以上の方活躍中】/在宅勤務
月給29万~34万円東京都新宿区(新宿駅) -
システム開発/東京都新宿区/【WEB面談可/C#経験者/20代後半~40代の方活躍中/経験年数不問】/在宅勤務
月給41万~50万円東京都新宿区(新宿駅) -
デバック、テスト項目の作成/神奈川県横浜市/【WEB面談可/C#経験者/20代前半の方活躍中/経験1年以上の方活躍中】/在宅勤務
月給29万~34万円神奈川県横浜市(桜木町駅) -
デバック、テスト項目の作成/神奈川県横浜市/【WEB面談可/C#経験者/20代後半~40代の方活躍中/経験年数不問】/在宅勤務
月給41万~50万円神奈川県横浜市(桜木町駅) -
基幹システム開発導入/東京都新宿区/【WEB面談可/C#経験者/20代前半の方活躍中/経験1年以上の方活躍中】/在宅勤務
月給29万~34万円東京都新宿区(西新宿駅) -
基幹システム開発導入/東京都新宿区/【WEB面談可/C#経験者/20代後半~40代の方活躍中/経験年数不問】/在宅勤務
月給41万~50万円東京都新宿区(西新宿駅)