MochiuWiki : SUSE, EC, PCB
案内
メインページ
最近の更新
おまかせ表示
MediaWiki についてのヘルプ
ツール
リンク元
関連ページの更新状況
特別ページ
ページ情報
We ask for
Donations
検索
個人用ツール
ログイン
Toggle dark mode
名前空間
ページ
議論
表示
閲覧
ソースを閲覧
履歴を表示
C Sharpの基礎 - ディレクトリのソースを表示
提供: MochiuWiki : SUSE, EC, PCB
←
C Sharpの基礎 - ディレクトリ
あなたには「このページの編集」を行う権限がありません。理由は以下の通りです:
この操作は、次のグループのいずれかに属する利用者のみが実行できます:
管理者
、new-group。
このページのソースの閲覧やコピーができます。
== 概要 == C#におけるディレクトリ操作は、<code>System.IO</code>名前空間に含まれる<code>Directory</code>クラスと<code>DirectoryInfo</code>クラスを使用して行う。<br> これらのクラスを使用することにより、ファイルシステム上のディレクトリに関する様々な操作や情報取得が可能になる。<br> <br> <code>Directory</code>クラスは静的メソッドを提供しており、特定のディレクトリインスタンスを作成せずにディレクトリ操作を行うことができる。<br> 一方、<code>DirectoryInfo</code>クラスはオブジェクト指向のアプローチを取り、特定のディレクトリに対して複数の操作を行う場合に有効である。<br> <br> * ディレクトリの作成 *: <code>Directory.CreateDirectory</code>メソッドを使用する。 *: このメソッドは指定されたパスにディレクトリが存在しない場合、そのディレクトリを作成する。 *: 既に存在する場合は何も行わず、エラーも発生しない。 *: <br> * ディレクトリの削除 *: <code>Directory.Delete</code>メソッドを使用する。 *: ただし、空でないディレクトリを削除しようとすると例外が発生するため、注意が必要である。 *: 再帰的に削除する場合は、オーバーロードされたメソッドを使用する。 *: <br> * ディレクトリの存在確認 *: <code>Directory.Exists</code>メソッドを使用する。 *: このメソッドは指定されたパスにディレクトリが存在するかどうかをブール値で返す。 *: <br> * ディレクトリの移動や名前変更 *: <code>Directory.Move</code>メソッドを使用する。 *: このメソッドは、ソースパスとデスティネーションパスを引数に取る。 <br> ディレクトリ内のファイルやサブディレクトリの列挙には、以下に示すメソッドを使用する。<br> これらのメソッドは、検索パターンや検索オプションを指定することにより、柔軟な検索が可能である。<br> * Directory.GetFilesメソッド * Directory.GetDirectoriesメソッド * Directory.GetFileSystemEntriesメソッド <br> <code>DirectoryInfo</code>クラスを使用する場合、まずインスタンスを生成して、そのインスタンスに対してメソッドを呼び出す。<br> 例えば、DirectoryInfo di = new DirectoryInfo(@"/home/user/hoge"); のようにインスタンスを生成して、Createメソッド、Deleteメソッド、MoveToメソッド等を使用する。<br> <br> ディレクトリのセキュリティ設定や属性の取得・設定も可能である。<br> <code>Directory.GetAccessControl</code>メソッドや<code>DirectoryInfo.Attributes</code>プロパティを使用することにより、これらの情報にアクセスすることができる。<br> <br> C#でのディレクトリ操作は、エラー処理が重要となる。<br> ファイルシステムへのアクセスはI/O操作を伴うため、IOExceptionやUnauthorizedAccessException等の例外が発生する可能性があるため、<br> 適切なtry-catchブロックを使用して、これらの例外を処理することが推奨される。<br> <br> また、.NET Coreや.NET 5以降では、クロスプラットフォームの開発がサポートされているため、パス区切り文字等の違いに注意が必要である。<br> <code>Path.DirectorySeparatorChar</code>を使用することにより、プラットフォーム間の互換性を保つことができる。<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> == ディレクトリの削除 == ディレクトリの削除には、3つのパターンが存在する。<br> * 空のディレクトリの削除 * ディレクトリとその中身の再帰的な削除 * 安全な削除 (存在確認付き) <br> ディレクトリの削除は、権限の問題やI/Oエラーが発生する可能性が高いため、エラーハンドリングが重要である。<br> <br> ディレクトリの削除は高速であるため、非同期処理は必要ない。<br> ただし、ネットワークドライブ上での操作等、遅延が予想される特殊なケースでは、以下に示すような方法で非同期で実行することができる。<br> <syntaxhighlight lang="c#"> Task.Run(() => Directory.Delete(path, true)); </syntaxhighlight> <br> ==== 空のディレクトリの削除 ==== 空のディレクトリを削除する。<br> ただし、ディレクトリが空でない場合は、例外が発生する。<br> <br> <syntaxhighlight lang="c#"> using System; using System.IO; class Program { static void Main(string[] args) { string path = "/home/user/emptyDirectory"; try { // 空のディレクトリを削除 Directory.Delete(path); } catch (IOException e) { Console.WriteLine($"エラー: ディレクトリが空ではない、または、存在しない {e.Message}"); } catch (UnauthorizedAccessException e) { Console.WriteLine($"エラー: アクセス権限がない {e.Message}"); } } } </syntaxhighlight> <br> ==== ディレクトリの再帰的削除 ==== 再帰的削除は、ディレクトリおよびディレクトリ内を全て削除する。<br> <br> <syntaxhighlight lang="c#"> using System; using System.IO; class Program { static void Main(string[] args) { string path = "/home/user/parentDirectory"; try { // ディレクトリおよびディレクトリ内容を再帰的に削除 Directory.Delete(path, true); } catch (DirectoryNotFoundException e) { Console.WriteLine($"エラー: ディレクトリが存在しない {e.Message}"); } catch (UnauthorizedAccessException e) { Console.WriteLine($"エラー: アクセス権限がない {e.Message}"); } catch (IOException e) { Console.WriteLine($"エラー: I/O エラーが発生 {e.Message}"); } } } </syntaxhighlight> <br> ==== ディレクトリの存在を確認してから再帰的削除 ==== ディレクトリの存在を確認することにより、安全に削除することができる。<br> これにより、不要な例外の発生を防ぐことができる。<br> <br> <syntaxhighlight lang="c#"> using System; using System.IO; class Program { static void Main(string[] args) { string path = "/home/user/directoryToDelete"; if (Directory.Exists(path)) { try { // ディレクトリが存在する場合のみ再帰的削除 Directory.Delete(path, true); } catch (UnauthorizedAccessException e) { Console.WriteLine($"エラー: アクセス権限がない {e.Message}"); } catch (IOException e) { Console.WriteLine($"エラー: I/O エラーが発生 {e.Message}"); } } else { Console.WriteLine($"ディレクトリが存在しない: {path}"); } } } </syntaxhighlight> <br><br> == ディレクトリの移動 / 名前変更 == C#では、ディレクトリの移動 / 名前変更は、同じ<code>Directory.Move</code>メソッドを使用する。<br> <br> ディレクトリの移動 / 名前変更は、権限の問題やI/Oエラーが発生する可能性が高いため、エラーハンドリングが重要である。<br> <br> ディレクトリの移動 / 名前変更は高速であるため、非同期処理は必要ない。<br> ただし、ネットワークドライブ上での操作等、遅延が予想される特殊なケースでは、以下に示すような方法で非同期で実行することができる。<br> <syntaxhighlight lang="c#"> Task.Run(() => Directory.Move(sourcePath, destPath)); </syntaxhighlight> <br> <u>※注意</u><br> <u>LinuxのファイルシステムはWindowsと異なり、大文字小文字を区別することに注意する。</u><br> <br> ==== 安全なディレクトリの移動 / 名前変更 ==== 以下の例では、移動先のディレクトリが既に存在する場合を考慮した安全な移動方法を示している。<br> これにより、予期せぬエラーを防ぐことができる。<br> <br> <syntaxhighlight lang="c#"> using System; using System.IO; class Program { static void Main(string[] args) { string sourcePath = "/home/user/sourceDirectory"; string destPath = "/home/user/destinationDirectory"; if (Directory.Exists(sourcePath)) { if (!Directory.Exists(destPath)) { try { Directory.Move(sourcePath, destPath); } catch (IOException e) { Console.WriteLine($"エラー: 移動中にI/Oエラーが発生 {e.Message}"); } catch (UnauthorizedAccessException e) { Console.WriteLine($"エラー: アクセス権限がない {e.Message}"); } } else { Console.WriteLine($"エラー: 移動先のディレクトリが既に存在する: {destPath}"); } } else { Console.WriteLine($"エラー: 移動元のディレクトリが存在しない: {sourcePath}"); } } } </syntaxhighlight> <br> ==== ディレクトリの名前変更 ==== 以下の例では、ディレクトリの名前変更に特化したプログラムを示している。<br> これは、同じディレクトリ内でのファイル名の変更に適している。<br> <br> <syntaxhighlight lang="c#"> using System; using System.IO; class Program { static void Main(string[] args) { string dirPath = "/home/user/oldName"; string newName = "newName"; try { string newPath = Path.Combine(Path.GetDirectoryName(dirPath), newName); if (Directory.Exists(dirPath)) { Directory.Move(dirPath, newPath); } else { Console.WriteLine($"エラー: 指定されたディレクトリが存在しない: {dirPath}"); } } catch (IOException e) { Console.WriteLine($"エラー: 名前変更中にI/Oエラーが発生 {e.Message}"); } catch (UnauthorizedAccessException e) { Console.WriteLine($"エラー: アクセス権限がない {e.Message}"); } } } </syntaxhighlight> <br><br> == パーミッション == .NET 5以降では、<code>System.IO.FileSystem</code>名前空間に<code>UnixFileMode</code>列挙型が追加された。<br> この列挙型を使用して、UNIX系OSのファイルパーミッションを扱うことができる。<br> <br> <u>ただし、<code>UnixFileMode</code>プロパティはLinux環境でのみ動作することに注意する。</u><br> <br> <syntaxhighlight lang="c#"> 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}"); } } } </syntaxhighlight> <br><br> __FORCETOC__ [[カテゴリ:C_Sharp]]
C Sharpの基礎 - ディレクトリ
に戻る。
案内
メインページ
最近の更新
おまかせ表示
MediaWiki についてのヘルプ
ツール
リンク元
関連ページの更新状況
特別ページ
ページ情報
We ask for
Donations
Collapse