「東雲 忠太郎」の平凡な日常のできごと

「東雲 忠太郎」の平凡な日常のできごと

2024.03.25
XML
カテゴリ: C#.NET


ファイルエクスプローラーは、ファイルシステム内のファイルやフォルダを表示し、操作するアプリケーションです。以下に、C# WPF でファイルエクスプローラーを作成する基本的なサンプルコードを示します。このサンプルでは、ディレクトリとその中のファイルを表示します。


まず、XAML を使用して UI を作成します。以下は、ファイルエクスプローラーの UI を表す XAML です。



<Window x:Class="FileExplorer.MainWindow"

        xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"

        xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"

        Title="File Explorer" Height="450" Width="800">

    <Grid>

        <TreeView x:Name="treeView" Margin="10"/>

        <ListView x:Name="listView" Margin="10,0,10,10">

            <ListView.View>

                <GridView>

                    <GridViewColumn Header="Name" Width="300" DisplayMemberBinding="{Binding Name}"/>

                    <GridViewColumn Header="Size" Width="100" DisplayMemberBinding="{Binding Size}"/>

                    <GridViewColumn Header="Type" Width="100" DisplayMemberBinding="{Binding Type}"/>

                </GridView>

            </ListView.View>

        </ListView>

    </Grid>

</Window>

```


次に、C# コードでファイルシステムを操作し、データを取得して UI にバインドします。


```csharp

using System.Collections.Generic;

using System.IO;

using System.Windows;

using System.Windows.Controls;


namespace FileExplorer

{

    public partial class MainWindow : Window

    {

        public MainWindow()

        {

            InitializeComponent();

            LoadDrives();

        }


        private void LoadDrives()

        {

            foreach (var drive in DriveInfo.GetDrives())

            {

                var driveNode = new TreeViewItem();

                driveNode.Header = drive.Name;

                driveNode.Tag = drive.RootDirectory;

                driveNode.Expanded += DriveNode_Expanded;

                treeView.Items.Add(driveNode);

            }

        }


        private void DriveNode_Expanded(object sender, RoutedEventArgs e)

        {

            var driveNode = (TreeViewItem)sender;

            if (driveNode.Items.Count == 0)

            {

                var driveInfo = (DirectoryInfo)driveNode.Tag;

                try

                {

                    foreach (var directory in driveInfo.GetDirectories())

                    {

                        var directoryNode = new TreeViewItem();

                        directoryNode.Header = directory.Name;

                        directoryNode.Tag = directory;

                        directoryNode.Items.Add(null); // ダミー要素を追加して展開アイコンを表示

                        directoryNode.Expanded += DirectoryNode_Expanded;

                        driveNode.Items.Add(directoryNode);

                    }

                }

                catch (UnauthorizedAccessException)

                {

                    MessageBox.Show("Access denied to some directories.");

                }

            }

        }


        private void DirectoryNode_Expanded(object sender, RoutedEventArgs e)

        {

            var directoryNode = (TreeViewItem)sender;

            if (directoryNode.Items.Count == 1 && directoryNode.Items[0] == null)

            {

                directoryNode.Items.Clear();

                var directoryInfo = (DirectoryInfo)directoryNode.Tag;

                try

                {

                    foreach (var directory in directoryInfo.GetDirectories())

                    {

                        var subDirectoryNode = new TreeViewItem();

                        subDirectoryNode.Header = directory.Name;

                        subDirectoryNode.Tag = directory;

                        subDirectoryNode.Items.Add(null); // ダミー要素を追加して展開アイコンを表示

                        subDirectoryNode.Expanded += DirectoryNode_Expanded;

                        directoryNode.Items.Add(subDirectoryNode);

                    }


                    foreach (var file in directoryInfo.GetFiles())

                    {

                        listView.Items.Add(new FileItem { Name = file.Name, Size = file.Length, Type = file.Extension });

                    }

                }

                catch (UnauthorizedAccessException)

                {

                    MessageBox.Show("Access denied to some directories or files.");

                }

            }

        }

    }


    public class FileItem

    {

        public string Name { get; set; }

        public long Size { get; set; }

        public string Type { get; set; }

    }

}

```


このコードでは、`DriveInfo.GetDrives()` を使用して利用可能なドライブを取得し、TreeView に表示します。TreeView の各アイテムが展開されるときに、そのディレクトリ内のサブディレクトリとファイルを取得し、TreeViewItem と ListView に追加します。


`FileItem` クラスは、ファイルの名前、サイズ、およびタイプを保持するために使用されます。`ListView` の各列は、このクラスのプロパティにバインドされます。






お気に入りの記事を「いいね!」で応援しよう

Last updated  2024.03.25 05:32:09


【毎日開催】
15記事にいいね!で1ポイント
10秒滞在
いいね! -- / --
おめでとうございます!
ミッションを達成しました。
※「ポイントを獲得する」ボタンを押すと広告が表示されます。
x

© Rakuten Group, Inc.
Design a Mobile Website
スマートフォン版を閲覧 | PC版を閲覧
Share by: