C Sharpの基礎 - ディレクトリ

提供:MochiuWiki - SUSE, Electronic Circuit, PCB
2024年9月16日 (月) 15:01時点におけるWiki (トーク | 投稿記録)による版 (ページの作成:「== 概要 == C#におけるディレクトリ操作は、<code>System.IO</code>名前空間に含まれる<code>Directory</code>クラスと<code>DirectoryInfo</code>クラスを使用して行う。<br> これらのクラスを使用することにより、ファイルシステム上のディレクトリに関する様々な操作や情報取得が可能になる。<br> <br> <code>Directory</code>クラスは静的メソッドを提供しており、特定のディ…」)
(差分) ← 古い版 | 最新版 (差分) | 新しい版 → (差分)
ナビゲーションに移動 検索に移動

概要

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を使用することにより、プラットフォーム間の互換性を保つことができる。

ディレクトリ操作を行う場合は、パフォーマンスにも注意が必要となる。
大量のファイルやディレクトリを扱う場合、非同期メソッドの使用や並列処理を検討することにより、アプリケーションの応答性を向上させることができる。


パーミッション

.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}");
       }
    }
 }