C#でディレクトリを作れるか? 削除できるか? §
できます。
ディレクトリ作成はSystem.IO.Directory.CreateDirectory メソッド、削除はSystem.IO.Directory.Delete メソッドです。
それぞれ引数にディレクトリのパス名を渡すだけです。
冴えたC#のディレクトリ作成法 §
System.IO.Directory.CreateDirectory メソッドには、【存在しないパスがあれば全て作成する】【既にパスがあってもエラーとして扱わない】という2大特徴が有ります。
ですから、深いディレクトリを作成する場合でも、メソッド呼び出しを1回行うだけで用が足ります。
逆に、【既にディレクトリがあったなら何も作成しない】という機能性を実現するために追加の判定コードは必要ありません。
冴えたC#のディレクトリ削除法 §
System.IO.Directory.Delete メソッドの第2引数がfalseの場合、空のディレクトリを削除することしかできません。trueにすると、ファイルやサブディレクトリがあってもまとめて全て削除してくれます。
ですから、あとからまとめて削除するファイルは一つのディレクトリにまとめて作成しておき、第2引数がtrueのSystem.IO.Directory.Delete メソッド呼び出し1回で削除するようにすると効率的です。
ディレクトリ作成削除の迷宮 §
ところが、この2つのメソッド、一緒に使うと一筋縄では行きません。
もし、深いディレクトリの作成と削除を行う時、引数に指定するパス名が同じではないからです。
- System.IO.Directory.CreateDirectory メソッド 深いパスの最も【深い】ディレクトリ名
- System.IO.Directory.Delete メソッド 深いパスの最も【浅い】ディレクトリ名
以下の例では作成する時は@"$$sampleDirRoot\a\b\c\d\e"を指定し、削除する時は@"$$sampleDirRoot"を指定しています。
更に言えば、以下の非対称性もあります。
- System.IO.Directory.Delete メソッドのみ第2引数にtrueが必要
- System.IO.Directory.Delete メソッドのみディレクトリ以外もまとめて消してしまう
- CreateDirectoryは名前にDirectoryを含むがDeleteは含まない
これらは操作の性質がAPIの仕様に反映されたものと言えます。
完全にこの2つのAPIを使いこなせば、この非対称の仕様で良かったと思えるはずです。
参考リンク §
Directory.CreateDirectory メソッド
Directory.Delete メソッド
リポジトリ §
https://github.com/autumn009/cshowto
CreateDeleteDirectory §
using System;
using System.IO;
class Program
{
static void Main()
{
// ドキュメントフォルダを取得するよー
var root = Environment.GetFolderPath(Environment.SpecialFolder.MyDocuments);
// ディレクトリを作成するよー
Directory.CreateDirectory(Path.Combine(root, @"$$sampleDirRoot\a\b\c\d\e"));
// 作成したディレクトリにテキストファイルを作成するよー
File.WriteAllText(Path.Combine(root, @"$$sampleDirRoot\a\b\c\d\e\f.txt"), "Hello! in Directory!");
// ファイルの存在をチェックするよー
checkFile();
// ディレクトリを削除するよー
Directory.Delete(Path.Combine(root, @"$$sampleDirRoot"), true);
// ファイルの存在をまたチェックするよー
checkFile();
// ファイルの存在チェックだよー
void checkFile()
{
// そのファイルはあるかな?
if (File.Exists(Path.Combine(root, @"$$sampleDirRoot\a\b\c\d\e\f.txt")))
// あったよ! あったから中味を出力するよ!
Console.WriteLine(File.ReadAllText(Path.Combine(root, @"$$sampleDirRoot\a\b\c\d\e\f.txt")));
else
// なかったよ。しょんぼり。
Console.WriteLine("File Not Found");
}
}
}
実行結果 §
Hello! in Directory!
File Not Found