「C Sharpの基礎 - ディレクトリ」の版間の差分
|  (ページの作成:「== 概要 == C#におけるディレクトリ操作は、<code>System.IO</code>名前空間に含まれる<code>Directory</code>クラスと<code>DirectoryInfo</code>クラスを使用して行う。<br> これらのクラスを使用することにより、ファイルシステム上のディレクトリに関する様々な操作や情報取得が可能になる。<br> <br> <code>Directory</code>クラスは静的メソッドを提供しており、特定のディ…」) | 編集の要約なし | ||
| 45行目: | 45行目: | ||
| ディレクトリ操作を行う場合は、パフォーマンスにも注意が必要となる。<br> | ディレクトリ操作を行う場合は、パフォーマンスにも注意が必要となる。<br> | ||
| 大量のファイルやディレクトリを扱う場合、非同期メソッドの使用や並列処理を検討することにより、アプリケーションの応答性を向上させることができる。<br> | 大量のファイルやディレクトリを扱う場合、非同期メソッドの使用や並列処理を検討することにより、アプリケーションの応答性を向上させることができる。<br> | ||
| <br><br> | |||
| == ディレクトリの作成 == | |||
| ディレクトリの作成は高速であるため、非同期処理は必要ない。<br> | |||
| ただし、ネットワークドライブ上での操作等、遅延が予想される特殊なケースでは、<code>Directory.CreateDirectoryAsync</code>メソッド (.NET 6以降で使用可能) を推奨する。<br> | |||
| <br> | |||
| ==== 新規作成 ==== | |||
| 以下の例では、ディレクトリを新規作成している。<br> | |||
| ただし、既存のディレクトリがある場合は何もしない。<br> | |||
| <br> | |||
|  <syntaxhighlight lang="c#"> | |||
|  using System; | |||
|  using System.IO; | |||
|  class Program | |||
|  { | |||
|     static void Main(string[] args) | |||
|     { | |||
|        string path = "/home/user/newDirectory"; | |||
|        // ディレクトリを作成 | |||
|        Directory.CreateDirectory(path); | |||
|     } | |||
|  } | |||
|  </syntaxhighlight> | |||
| <br> | |||
| ==== 既存のディレクトリを確認してから新規作成 ==== | |||
| 既存ディレクトリを確認する方法は、不要な処理を避ける場合に有効である。<br> | |||
| <br> | |||
|  <syntaxhighlight lang="c#"> | |||
|  using System; | |||
|  using System.IO; | |||
|  class Program | |||
|  { | |||
|     static void Main(string[] args) | |||
|     { | |||
|        string path = "/home/user/newDirectory"; | |||
|        // ディレクトリが存在しない場合のみ作成 | |||
|        if (!Directory.Exists(path)) | |||
|        { | |||
|           Directory.CreateDirectory(path); | |||
|           Console.WriteLine($"ディレクトリの新規作成: {path}"); | |||
|        } | |||
|        else | |||
|        { | |||
|           Console.WriteLine($"ディレクトリは既に存在する: {path}"); | |||
|        } | |||
|     } | |||
|  } | |||
|  </syntaxhighlight> | |||
| <br> | |||
| ==== サブディレクトリを含む複数階層のディレクトリを新規作成 ==== | |||
| 複数階層の作成は、複雑なディレクトリ構造を1度に作成することができる。<br> | |||
| <br> | |||
|  <syntaxhighlight lang="c#"> | |||
|  using System; | |||
|  using System.IO; | |||
|  class Program | |||
|  { | |||
|     static void Main(string[] args) | |||
|     { | |||
|        string path = "/home/user/parent/child/grandchild"; | |||
|        try | |||
|        { | |||
|           // 複数階層のディレクトリを1度に新規作成 | |||
|           DirectoryInfo di = Directory.CreateDirectory(path); | |||
|           Console.WriteLine($"ディレクトリ構造を新規作成: {di.FullName}"); | |||
|           // 作成されたディレクトリの情報を表示 | |||
|           Console.WriteLine($"作成日時: {di.CreationTime}"); | |||
|           Console.WriteLine($"親ディレクトリ: {di.Parent.FullName}"); | |||
|        } | |||
|        catch (Exception e) | |||
|        { | |||
|           Console.WriteLine($"エラーが発生: {e.Message}"); | |||
|        } | |||
|     } | |||
|  } | |||
|  </syntaxhighlight> | |||
| <br><br> | <br><br> | ||
2024年9月16日 (月) 15:15時点における版
概要
C#におけるディレクトリ操作は、System.IO名前空間に含まれるDirectoryクラスとDirectoryInfoクラスを使用して行う。
これらのクラスを使用することにより、ファイルシステム上のディレクトリに関する様々な操作や情報取得が可能になる。
Directoryクラスは静的メソッドを提供しており、特定のディレクトリインスタンスを作成せずにディレクトリ操作を行うことができる。
一方、DirectoryInfoクラスはオブジェクト指向のアプローチを取り、特定のディレクトリに対して複数の操作を行う場合に有効である。
- ディレクトリの作成
- Directory.CreateDirectoryメソッドを使用する。
- このメソッドは指定されたパスにディレクトリが存在しない場合、そのディレクトリを作成する。
- 既に存在する場合は何も行わず、エラーも発生しない。
 
- ディレクトリの削除
- Directory.Deleteメソッドを使用する。
- ただし、空でないディレクトリを削除しようとすると例外が発生するため、注意が必要である。
- 再帰的に削除する場合は、オーバーロードされたメソッドを使用する。
 
- ディレクトリの存在確認
- Directory.Existsメソッドを使用する。
- このメソッドは指定されたパスにディレクトリが存在するかどうかをブール値で返す。
 
- ディレクトリの移動や名前変更
- Directory.Moveメソッドを使用する。
- このメソッドは、ソースパスとデスティネーションパスを引数に取る。
 
ディレクトリ内のファイルやサブディレクトリの列挙には、以下に示すメソッドを使用する。
これらのメソッドは、検索パターンや検索オプションを指定することにより、柔軟な検索が可能である。
- Directory.GetFilesメソッド
- Directory.GetDirectoriesメソッド
- Directory.GetFileSystemEntriesメソッド
DirectoryInfoクラスを使用する場合、まずインスタンスを生成して、そのインスタンスに対してメソッドを呼び出す。
例えば、DirectoryInfo di = new DirectoryInfo(@"/home/user/hoge"); のようにインスタンスを生成して、Createメソッド、Deleteメソッド、MoveToメソッド等を使用する。
ディレクトリのセキュリティ設定や属性の取得・設定も可能である。
Directory.GetAccessControlメソッドやDirectoryInfo.Attributesプロパティを使用することにより、これらの情報にアクセスすることができる。
C#でのディレクトリ操作は、エラー処理が重要となる。
ファイルシステムへのアクセスはI/O操作を伴うため、IOExceptionやUnauthorizedAccessException等の例外が発生する可能性があるため、
適切なtry-catchブロックを使用して、これらの例外を処理することが推奨される。
また、.NET Coreや.NET 5以降では、クロスプラットフォームの開発がサポートされているため、パス区切り文字等の違いに注意が必要である。
Path.DirectorySeparatorCharを使用することにより、プラットフォーム間の互換性を保つことができる。
ディレクトリ操作を行う場合は、パフォーマンスにも注意が必要となる。
大量のファイルやディレクトリを扱う場合、非同期メソッドの使用や並列処理を検討することにより、アプリケーションの応答性を向上させることができる。
ディレクトリの作成
ディレクトリの作成は高速であるため、非同期処理は必要ない。
ただし、ネットワークドライブ上での操作等、遅延が予想される特殊なケースでは、Directory.CreateDirectoryAsyncメソッド (.NET 6以降で使用可能) を推奨する。
新規作成
以下の例では、ディレクトリを新規作成している。
ただし、既存のディレクトリがある場合は何もしない。
 using System;
 using System.IO;
 
 class Program
 {
    static void Main(string[] args)
    {
       string path = "/home/user/newDirectory";
 
       // ディレクトリを作成
       Directory.CreateDirectory(path);
    }
 }
既存のディレクトリを確認してから新規作成
既存ディレクトリを確認する方法は、不要な処理を避ける場合に有効である。
 using System;
 using System.IO;
 
 class Program
 {
    static void Main(string[] args)
    {
       string path = "/home/user/newDirectory";
 
       // ディレクトリが存在しない場合のみ作成
       if (!Directory.Exists(path))
       {
          Directory.CreateDirectory(path);
          Console.WriteLine($"ディレクトリの新規作成: {path}");
       }
       else
       {
          Console.WriteLine($"ディレクトリは既に存在する: {path}");
       }
    }
 }
サブディレクトリを含む複数階層のディレクトリを新規作成
複数階層の作成は、複雑なディレクトリ構造を1度に作成することができる。
 using System;
 using System.IO;
 
 class Program
 {
    static void Main(string[] args)
    {
       string path = "/home/user/parent/child/grandchild";
 
       try
       {
          // 複数階層のディレクトリを1度に新規作成
          DirectoryInfo di = Directory.CreateDirectory(path);
          Console.WriteLine($"ディレクトリ構造を新規作成: {di.FullName}");
 
          // 作成されたディレクトリの情報を表示
          Console.WriteLine($"作成日時: {di.CreationTime}");
          Console.WriteLine($"親ディレクトリ: {di.Parent.FullName}");
       }
       catch (Exception e)
       {
          Console.WriteLine($"エラーが発生: {e.Message}");
       }
    }
 }
パーミッション
.NET 5以降では、System.IO.FileSystem名前空間にUnixFileMode列挙型が追加された。
この列挙型を使用して、UNIX系OSのファイルパーミッションを扱うことができる。
ただし、UnixFileModeプロパティはLinux環境でのみ動作することに注意する。
 using System;
 using System.IO;
 
 class DirectoryPermissions
 {
    static void Main(string[] args)
    {
       // ディレクトリのパス
       string dirPath = $"/usr/bin";
 
       // ディレクトリが存在するかどうかを確認
       if (!Directory.Exists(dirPath))
       {
          Console.WriteLine("指定されたディレクトリが存在しない");
          return;
       }
 
       try
       {
          // ディレクトリの情報を取得
          DirectoryInfo dirInfo = new DirectoryInfo(dirPath);
 
          // Unixファイルモードを取得
          UnixFileMode mode = dirInfo.UnixFileMode;
 
          // パーミッションを8進数で表示
          Console.WriteLine($"ディレクトリ: {dirPath}");
          Console.WriteLine($"パーミッション: {Convert.ToString((int)mode, 8).PadLeft(4, '0')}");
 
          // 詳細なパーミッション情報を表示
          Console.WriteLine("詳細:");
          Console.WriteLine($"ユーザー: {((mode & UnixFileMode.UserRead) != 0 ? "r" : "-")}" +
                            $"{((mode & UnixFileMode.UserWrite) != 0 ? "w" : "-")}" +
                            $"{((mode & UnixFileMode.UserExecute) != 0 ? "x" : "-")}");
          Console.WriteLine($"グループ: {((mode & UnixFileMode.GroupRead) != 0 ? "r" : "-")}" +
                            $"{((mode & UnixFileMode.GroupWrite) != 0 ? "w" : "-")}" +
                            $"{((mode & UnixFileMode.GroupExecute) != 0 ? "x" : "-")}");
          Console.WriteLine($"その他:   {((mode & UnixFileMode.OtherRead) != 0 ? "r" : "-")}" +
                            $"{((mode & UnixFileMode.OtherWrite) != 0 ? "w" : "-")}" +
                            $"{((mode & UnixFileMode.OtherExecute) != 0 ? "x" : "-")}");
       }
       catch (Exception ex)
       {
          Console.WriteLine($"エラーが発生: {ex.Message}");
       }
    }
 }