2020年09月02日
川俣晶の縁側ソフトウェアC# コーディング How Tototal 980 count

【入門級】C#でディレクトリの作成、削除を行う方法

Written By: 川俣 晶連絡先

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

Facebook

COOL C# CREW

C#ハウツー連載の解説増量、カラーのソース、新規書き下ろし追加の読みやすい単行本はこちら。

C#ハウツー: 逆引き入門・こんな機能はどう書くの?
キーワード【 川俣晶の縁側ソフトウェアC# コーディング How To
【C# コーディング How To】の次のコンテンツ
2020年
09月
03日
【入門級】C#で文字列の順番を逆転する
3days 0 count
total 1445 count
【C# コーディング How To】の前のコンテンツ
(ありません)

このコンテンツを書いた川俣 晶へメッセージを送る

[メッセージ送信フォームを利用する]

メッセージ送信フォームを利用することで、川俣 晶に対してメッセージを送ることができます。

この機能は、100%確実に川俣 晶へメッセージを伝達するものではなく、また、確実に川俣 晶よりの返事を得られるものではないことにご注意ください。

このコンテンツへトラックバックするためのURL

http://mag.autumn.org/tb.aspx/20200902093832
サイトの表紙【C# コーディング How To】の表紙【C# コーディング How To】のコンテンツ全リスト 【C# コーディング How To】の入手全リスト 【C# コーディング How To】のRSS1.0形式の情報このサイトの全キーワードリスト 印刷用ページ

管理者: 川俣 晶連絡先

Powered by MagSite2 Version 0.36 (Alpha-Test) Copyright (c) 2004-2021 Pie Dey.Co.,Ltd.