【C#】TreeViewでエクスプローラのツリーの部分(フォルダ構成)を表示する

10月 20, 2022

TreeViewでエクスプローラのツリーの部分(フォルダ構成)を表示

今回使用した環境

インターネット接続可能のオンラインの環境

64 ビット オペレーティング システム

Windows 10 21H2

Visual Studio 2022 C# .NET Framework 4.8

フォームデザイン

フォームの真ん中にTreeViewのコントロールを配置しました。

ソースコード

以下はTreeNodeクラスを継承した、フォルダを表すDirTreeNodeクラスです。

自分自身のフォルダパスを表すプロパティ「DirectoryPath」を持っています。

class DirTreeNode : TreeNode
{
    // 仮のノード用のコンストラクタ
    public DirTreeNode() { }

    // コンストラクタにてフォルダ名、フォルダパスを設定
    public DirTreeNode(string directoryName, string directoryPath) : base(directoryName)
    {
        this.DirectoryPath = directoryPath;
    }

    // フォルダパス
    public string DirectoryPath { get; set; }
}

以下はフォームのクラスです。

このサンプルコードでは固定でEドライブ配下のツリー表示に限定させてもらっています。

public partial class Form1 : Form
{
    private void Form1_Load(object sender, EventArgs e)
    {
        // はじめにドライブをツリーに追加しておく
        DirTreeNode driveNode = new DirTreeNode("E", "E:\\");
        treeView1.Nodes.Add(driveNode);

        // +ボタンを表示させるために仮のノードを追加しておく
        // ※ここではドライブ配下にはなんらかのフォルダが存在する前提
        driveNode.Nodes.Add(new DirTreeNode());
    }

    private void treeView1_BeforeExpand(object sender, TreeViewCancelEventArgs e)
    {
        // 展開するノードを取得
        DirTreeNode dirNode = (DirTreeNode)e.Node;

        // 展開ノード配下のノードをクリア
        dirNode.Nodes.Clear();

        // 展開するノード配下のフォルダ数を繰り返し
        foreach (string directoryPath in Directory.GetDirectories(dirNode.DirectoryPath))
        {
            // フォルダ情報を取得
            DirectoryInfo directoryInfo = new DirectoryInfo(directoryPath);
            
            // OSのシステムフォルダはここで除外する
            if ((directoryInfo.Attributes & FileAttributes.System) != FileAttributes.System)
            {
                // 展開するノード配下にサブフォルダのノードを追加
                DirTreeNode subDirNode = new DirTreeNode(directoryInfo.Name, directoryPath);
                dirNode.Nodes.Add(subDirNode);

                // サブフォルダ配下にさらにフォルダがある場合
                if (Directory.GetDirectories(directoryPath).Length > 0)
                {
                    // +ボタンを表示させるために仮のノードを追加しておく
                    subDirNode.Nodes.Add(new DirTreeNode());
                }
            }
        }
    }
}

※OSのシステムフォルダは表示したくなかったので29行目の処理で除外しています。

※例外処理はしていないのでフォルダに対するアクセス権がない場合、UnauthorizedAccessExceptionが発生する場合があります。

動作確認

まずは下の画像がエクスプローラで見たEドライブ配下のフォルダ構成です。

そして実行結果がこちら。エクスプローラのツリーと同じになりました。

以上となります。

ここまでお読みいただきありがとうございました。

C#

Posted by だゆう