ハルの読書と勉強録

読書の記録や勉強の覚書です。

ドラッグ&ドロップでフォルダ内のファイル名を取得するアプリ(C#)

C#を使用し、ドラッグ&ドロップでフォルダ内のファイル名を取得するアプリについて解説します。

ソースは下記githubにて公開しています。

https://github.com/haru-labo/FileNameGetter

アプリ概要

  • フォーム内にドラッグ&ドロップされたフォルダ内にあるファイル名とサブフォルダ名をテキストボックスに表示
  • ファイルの場合はファイル名のみ表示
  • サブフォルダ以下のファイルおよびフォルダは表示しない

開発環境

処理の流れ

  1. フォーム上にドラッグされてきたアイテム(ファイルおよびフォルダ)をコピー
  2. ドロップ時にアイテムの絶対パスを取得(配列)
  3. 配列からアイテム(正確には絶対パス)を1つずつ取り出し、フォルダかファイルかを判定
  4. フォルダの場合は、フォルダ内のファイルパスとサブフォルダパスを取得(配列)
  5. 取得したパスを1つずつ取り出し、ファイル名とサブフォルダ名のみテキストボックスに表示
  6. ファイル(フォルダ以外)の場合は、ファイル名のみテキストボックスに表示

■準備

  1. フォーム上にテキストボックスを配置
  2. テキストボックスの「Multiline」プロパティを「True」に設定

ドラッグ&ドロップ操作実装に必要な設定

  1. AllowDrop(プロパティ)
    • ドラッグ&ドロップ操作を受け入れる(True)
  2. DragEnter(イベントハンドラ
    • アイテムをコントロール上にドラッグしてきたときの処理
  3. DragDrop(イベントハンドラ
    • ドラッグされたアイテムがドロップされたときの処理
イベントハンドラの記述(抜粋)》
//フォーム内にドラッグしたアイテムをコピー
private void FileNameGetter_DragEnter(object sender, DragEventArgs e)
{
  e.Effect = DragDropEffects.Copy; //.Allでも可
}

  //ドロップ時の処理
private void FileNameGetter_DragDrop(object sender, DragEventArgs e)
{
  //ドロップアイテム全てのパスを取得
  string[] dropItemPath = (string[])e.Data.GetData(DataFormats.FileDrop, false);

  //ドロップアイテム個々のパスを取得
  foreach (string dropItem in dropItemPath)
  {
    //ドロップがディレクトリの場合
    if (System.IO.Directory.Exists(dropItem))
    {
      //フォルダ内のファイル名を取得
      string[] files = System.IO.Directory.GetFiles(@dropItem, "*", System.IO.SearchOption.TopDirectoryOnly);

      //サブフォルダ名を取得
      IEnumerable<string> directryNames = System.IO.Directory.EnumerateDirectories(@dropItem, "*", System.IO.SearchOption.TopDirectoryOnly);

      //ファイルパスからファイル名を取得し、テキストボックスに追加
      foreach (string fileName in files)
      {
        textBox.AppendText(System.IO.Path.GetFileName(fileName) + "\r\n");
      }

      //サブフォルダ名を《》で囲み表示
      foreach (string subDirName in directryNames)
      {
        textBox.AppendText("《" + System.IO.Path.GetFileName(subDirName) + "》\r\n");
      }

      textBox.AppendText("\r\n");

    }
    //ドロップがディレクトリ以外
    else
    {
      textBox.AppendText(System.IO.Path.GetFileName(dropItem) + "\r\n");
    }
}

■補足

1.フォルダとファイルの判定
System.IO.Directory.Exists(string path)

パス(string path)が示すアイテムがフォルダであれば「True」が返る。

 

2.フォルダ内のファイル名の取得
string[] 変数名 = System.IO.Directory.GetFiles(@string path, "検索条件", System.IO.SearchOption.TopDirectoryOnly);

パス(string path)のフォルダに含まれるファイルのパスを変数に格納。

第3引数の「TopDirectoryOnly」を「AllDirectries」にすれば、サブフォルダ内も検索対象となる。

Directory.GetFiles」を「Directory.GetDirectries」にすると、サブフォルダが検索対象となる。

 

3.フォルダ内のサブフォルダ名の取得
IEnumerable<string> 変数名 = System.IO.Directory.EnumerateDirectories(@string path, "検索条件", System.IO.SearchOption.TopDirectoryOnly)

結果は上記「System.IO.Directory.GetDirectries()」と同様。

こちらはフォルダが見つかり次第結果を返すため、処理が早い場合がある。

 

4.パスからファイルもしくはフォルダの名称のみ取得
System.IO.Path.GetFileName(string path)

フォルダに対しても使用可能。

 

5.テキストボックスへのテキスト追加
TextBox.AppendText(string text)

テキストボックスの現在のテキストに、テキスト(string text)を追加する。