(:3[kanのメモ帳]

個人ゲーム開発者kan.kikuchiのメモ的技術ブログ。月木更新でUnity関連がメイン。

ディレクトリとその中身を全て削除、ディレクトリをコピー【C#】


このエントリーをはてなブックマークに追加

はじめに

C#でディレクトリを削除する時は以下のようにします。

//System.IOを忘れずに
using System.IO;

//Assetsディレクトリ以下にあるTestディレクトリを削除
Directory.Delete("Assets/Test");


しかし、ディレクトリ内にファイルが残っていると、

IOException: Directory Assets/Test is not empty

とエラーが出て削除できません。


なので今回はディレクトリとその中身を全て削除する方法についての記事です。

ついでに専用のメソッドが用意されていないディレクトリのコピーについても記載します。


ディレクトリとその中身を全て削除

と言ってもやる事は至極単純で、

ディレクトリの中を全て削除してから、ディレクトリを削除するだけです。

実際のコードが以下の通りです。

//Assetsディレクトリ以下にあるTestディレクトリを削除
/// <summary>
/// 指定したディレクトリとその中身を全て削除する
/// </summary>
public static void Delete(string targetDirectoryPath){
  if (!Directory.Exists (targetDirectoryPath)) {
    return;
  }

  //ディレクトリ以外の全ファイルを削除
  string[] filePaths = Directory.GetFiles(targetDirectoryPath);
  foreach (string filePath in filePaths){
    File.SetAttributes(filePath, FileAttributes.Normal);
    File.Delete(filePath);
  }

  //ディレクトリの中のディレクトリも再帰的に削除
  string[] directoryPaths = Directory.GetDirectories(targetDirectoryPath);
  foreach (string directoryPath in directoryPaths){
    Delete(directoryPath);
  }

  //中が空になったらディレクトリ自身も削除
  Directory.Delete(targetDirectoryPath, false);
}


ディレクトリAの中にディレクトリBがある場合はディレクトリBの中のファイルを先に削除、

さらにその中にディレクトリCが……という具合に再帰的に削除を行っています。


ディレクトリのコピー

つづいてディレクトリのコピーについてです。

残念ながらDirectory.Copyのようなメソッドが用意されていないので、

以下のようなコードでコピーを行います。


なお、ファイルのコピーについてはFile.Copyというメソッドが用意されています。

/// <summary>
/// ディレクトリとその中身を上書きコピー
/// </summary>
public static void CopyAndReplace(string sourcePath, string copyPath){
  //既にディレクトリがある場合は削除し、新たにディレクトリ作成
  Delete (copyPath);
  Directory.CreateDirectory(copyPath);

  //ファイルをコピー
  foreach (var file in Directory.GetFiles(sourcePath)){
    File.Copy(file, Path.Combine(copyPath, Path.GetFileName(file)));
  }

  //ディレクトリの中のディレクトリも再帰的にコピー
  foreach (var dir in Directory.GetDirectories(sourcePath)){
    CopyAndReplace(dir, Path.Combine(copyPath, Path.GetFileName(dir)));
  }
}


Deleteは上記にあったディレクトリとその中身を全て削除メソッドです。

なので、既に同名のディレクトリがある場合は中身を全て削除するので注意が必要です。


DirectoryProcessor

上記のメソッドをまとめ、DirectoryProcessorというクラスを作り

いつでも使えるようにすると便利です。



Unityでの使用機会はあまり無さそうですが……


終わりに

余談ですが、Unityで今回のような操作をしそうな場面と言えばエディタ拡張ですね。


そもそも、とあるエディタ拡張の記事を書こうと思った際に

ディレクトリ操作についての先に記事を出した方が良えな。

と考えて出したのが今回の記事だったりします。