C# フォルダ操作方法まとめ

目次

フォルダ、サブフォルダを作成する

System.IO.Directory.CreateDirectoryメソッドを使用すると指定したパスにフォルダとサブフォルダを作成することが出来ます。

CreateDirectoryメソッドの引数に作成するフォルダのパスを指定します。
パスは絶対パスまたは相対パスを指定します。相対パスは現在のカレントディレクトリからのパスになります。

戻り値はDirectoryInfoクラスです。
指定したパスに既にフォルダが存在する場合は何も起きません。

using System;
using System.IO;
class Program
{
    public static void Main()
    {
        // 作成するフォルダのパス
        string dirPath = @"D:\yasnote\test\test\test";

        // フォルダ、サブフォルダの作成(サブフォルダも一緒に作成される)
        Directory.CreateDirectory(dirPath);
    }
}

指定したフォルダを削除する

System.IO.Directory.Deleteメソッドを使うと指定したフォルダを削除することができます。
Deleteメソッドの第1引数に削除するフォルダのパス、第2引数には指定したフォルダにあるサブフォルダ、ファイルも削除するかのフラグ(true、false)を指定します。

第1引数にはフォルダの絶対パスまたは相対パスを指定することができます。
相対パスは現在のカレントディレクトリからのパスになります。

第2引数をfalseにした場合、指定したフォルダにサブフォルダ、ファイルが存在するとエラーになるので注意してください。
第2引数をtrueにした場合、指定したフォルダとそのフォルダにあるサブフォルダ、ファイルがすべて削除されます。

using System;
using System.IO;
class Program
{
    public static void Main()
    {
        // 削除するフォルダのパス
        string dirPath = @"D:\yasnote\test";

        // 指定したフォルダとその下の階層すべてを削除する
        Directory.Delete(dirPath, true);
    }
}

フォルダ内のファイル名一覧を取得する

フォルダ内のファイル名一覧をすべて取得する

System.IO.Directory.EnumerateFilesメソッドを使うと指定したフォルダ内にあるファイルの一覧を取得することができます。

System.IO.Directory.GetFilesメソッドでも同じことができますが、GetFilesの場合はフォルダ内のファイルをすべて検索してから戻り値を返すのに対し、EnumerateFilesメソッドファイルが見つかると一旦呼び出し元に処理が戻ってきます
これの何がいいのか?と言うと、フォルダ内にファイルが大量にあり検索に時間がかかる時にGetFilesを使うとすべてのファイルを検索してから処理が呼び出し元に返ってくるため検索中は処理が止まったように見えます。EnumerateFilesメソッドの場合はファイルが見つかると一旦処理が返ってくるため、待機時間が短くなります。

フォルダ内にあるファイル一覧を取得するには、
System.IO.Directory.EnumerateFilesメソッドの引数に検索するフォルダのパスを指定します。戻り値はファイルのパスが入ったstringの列挙可能型(IEnumerable<string>)です。引数を1つだけ指定した場合は、フォルダ内にあるファイルのみが検索対象になります。

using System;
using System.IO;
class Program
{
    public static void Main()
    {
        // フォルダのパス
        var dirPath = @"D:\source\repos\test\test";

        // 指定したフォルダ内のファイル名一覧を取得する
        foreach (string file in Directory.EnumerateFiles(dirPath)) {
            Console.WriteLine(file);
        }
    }
}

こんな感じで各ファイルの絶対パスが返ってきます。

D:\source\repos\test\test\Class1.cs
D:\source\repos\test\test\Program.cs
D:\source\repos\test\test\test.csproj

ワイルドカードを使い取得するファイルを絞る

EnumerateFilesメソッドの第2引数にワイルドカードを使った検索パターンを指定することが出来ます。

第1引数には検索するフォルダのパスを指定します。
第2引数にはワイルドカードを使った検索パターンを指定します。

全てのファイルを対象にする場合「*」、
拡張子を指定する場合、「*.txt」、「*.cs」のように指定します。
戻り値は同じくファイルのパスが入ったstringの列挙可能型(IEnumerable<string>)です。

using System;
using System.IO;
class Program
{
    public static void Main()
    {
        // フォルダのパス
        var dirPath = @"D:\source\repos\test\test";

        // 指定したフォルダ内からソースファイル(*.cs)を取得する
        foreach (string file in Directory.EnumerateFiles(dirPath, "*.cs")) {
            Console.WriteLine(file);
        }
    }
}

出力結果はこんな感じでcsファイルだけ取得することが出来ます。

D:\source\repos\test\test\Class1.cs
D:\source\repos\test\test\Program.cs

フォルダ内のサブフォルダを含めてファイルを検索する

EnumerateFilesメソッドの第3引数に検索オプション(指定フォルダ内のみ、サブフォルダも検索対象にする)を指定することが出来ます。

第1引数には検索するフォルダのパスを指定します。
第2引数にはワイルドカードを使った検索パターンを指定します。
第3引数に検索オプション(System.IO.SearchOption)を指定します。

検索オプションは以下の2つから選択します。
SearchOption.AllDirectories : 指定されたフォルダとサブフォルダ内のファイルが対象
SearchOption.TopDirectoryOnly : 指定されたフォルダ内のファイルが対象

using System;
using System.IO;
class Program
{
    public static void Main()
    {
        // フォルダのパス
        var dirPath = @"D:\source\repos\test\test";

        // 指定したフォルダ内からソースファイル(*.cs)を取得する
        foreach (string file in Directory.EnumerateFiles(dirPath, "*", SearchOption.AllDirectories)) {
            Console.WriteLine(file);
        }
    }
}

EnumerationOptionsを指定してサブフォルダを検索対象にする

EnumerateFilesメソッドの第3引数にEnumerationOptionsクラスを指定してサブフォルダを検索することもできます。

第3引数にあらかじめRecurseSubdirectoriesプロパティtrueを設定したEnumerationOptionsクラスのインスタンスを渡します。

using System;
using System.IO;
class Program
{
    public static void Main()
    {
        // フォルダのパス
        var dirPath = @"D:\source\repos\test\test";

        // 検索オプションの設定
        var op = new EnumerationOptions { 
            // サブフォルダも対象にする
            RecurseSubdirectories = true,
        };

        // 指定したフォルダとサブフォルダ内からファイル一覧を取得する
        foreach (string file in Directory.EnumerateFiles(dirPath, "*", op)) {
            Console.WriteLine(file);
        }
    }
}

他のEnumerationOptionsクラスのプロパティは以下になります。

プロパティ説明規定値
AttributesToSkipスキップするファイルの属性を指定しますHidden | System
隠しファイルとシステムファイルはスキップ
BufferSize推奨されるバッファーサイズを指定します0
Ignorelnaccessibleファイルにアクセス拒否された場合にスキップするかを指定しますtrue
MatchCasing大文字と小文字の区別をどうするかSystem.IO.MatchCasing.PlatformDefault
プラットフォームに依存する
MatchType使用するワイルドカードの種類を指定するSystem.IO.MatchType.Simple
*と?をワイルドカードとして使用
RecurseSubdirectoriesサブフォルダを対象にするかを指定するfalse
しない
ReturnSpecialDirectories特殊なディレクトリ「.」「..」を取得するかを指定するfalse
しない

実行ファイル(.exe)の場所を取得する

System.IO.Directory.GetCurrentDirectoryメソッドを使うとプログラムが実行されている場所を取得することができます。

正確にはカレントディレクトリーの初期値がプログラムが実行されている場所になります。

using System;
using System.IO;
class Program
{
    public static void Main()
    {
        // カレントディレクトリを取得(初期値はプログラムを実行した場所)
        Console.WriteLine(Directory.GetCurrentDirectory());
    }
}

System.Environment.CurrentDirectoryプロパティを使っても取得することが出来ます。

using System;
class Program
{
    public static void Main()
    {
        Console.WriteLine(System.Environment.CurrentDirectory);
    }
}

フォルダの作成日時、更新日時の取得

フォルダの作成日時を取得するには、System.IO.Directory.GetCreationTimeメソッド
フォルダの更新日時を取得するには、System.IO.Directory.GetLastWriteTimeメソッドを使います。

それぞれのメソッドの引数にフォルダのパスを指定します。
戻り値は日付データ(DateTime構造体)です。

using System;
using System.IO;
class Program
{
    public static void Main()
    {
        // フォルダのパス
        var dirPath = @"D:\source\repos\test\test";

        // フォルダの作成日時を取得
        Console.WriteLine($"作成日時: {Directory.GetCreationTime(dirPath)}");

        // フォルダの更新日時を取得
        Console.WriteLine($"更新日時: {Directory.GetLastWriteTime(dirPath)}");
    }
}
作成日時    : 2020/02/13 23:55:58
更新日時    : 2020/04/26 19:16:19

フォルダの作成日時、更新日時の設定

フォルダの作成日時を設定するには、System.IO.Directory.SetCreationTimeメソッド
フォルダの更新日時を設定するには、System.IO.Directory.SetLastWriteTimeメソッドを使います。

それぞれのメソッドの第1引数にフォルダのパス第2引数に設定する日付データ(DateTime構造体)を指定します。

using System;
using System.IO;
class Program
{
    public static void Main()
    {
        // フォルダのパス
        var dirPath = @"D:\source\repos\test\test";

        // フォルダの作成日時を取得
        Console.WriteLine($"設定前作成日時: {Directory.GetCreationTime(dirPath)}");

        // フォルダの更新日時を取得
        Console.WriteLine($"設定前更新日時: {Directory.GetLastWriteTime(dirPath)}");

        // 現在時刻を取得
        var now = DateTime.Now;
        Console.WriteLine($"{now}を設定");

        // フォルダの作成日時を設定
        Directory.SetCreationTime(dirPath, now);

        // フォルダの更新日時を設定
        Directory.SetLastWriteTime(dirPath, now);

        // フォルダの作成日時を取得
        Console.WriteLine($"設定後作成日時: {Directory.GetCreationTime(dirPath)}");

        // フォルダの更新日時を取得
        Console.WriteLine($"設定後更新日時: {Directory.GetLastWriteTime(dirPath)}");
    }
}

出力結果はこんな感じです。作成日時、更新日時が変更されました。

設定前作成日時: 2020/04/26 19:26:41
設定前更新日時: 2020/04/26 19:28:03
2020/04/26 19:28:04を設定
設定後作成日時: 2020/04/26 19:28:04
設定後更新日時: 2020/04/26 19:28:04

フォルダの存在を確認する

System.IO.Directory.Existメソッドを使うと指定したパスにディレクトリ(フォルダ)が存在するか確認することが出来ます。

引数には確認したいフォルダのパスを指定します。
フォルダパスは大文字、小文字は区別されません。
フォルダのパスには絶対パスまたはプログラム実行ファイル(.exeファイル)からの相対パスを指定することが出来ます。

戻り値はフォルダが存在する場合にTrue、存在しない場合はFalseが返ってきます。

using System;
using System.IO;
class Program
{
    public static void Main()
    {
        var strDirPath = @"D:\src";
        if (Directory.Exists(strDirPath))
        {
            Console.WriteLine("フォルダあり");
        }
        else 
        {
            Console.WriteLine("フォルダなし");
        }
    }
}
よかったらシェアしてね!
  • URLをコピーしました!
  • URLをコピーしました!
目次