2013年08月19日

ファイル名が欲しい4

今回は、複数のファイル名に対する一括操作を追加してみようと思います


■一括操作用のメニューを追加
・フォームを選択した状態で、「一括操作(&O)」メニューを追加する


■ファイル名だけを抜き出す(ドライブ名、ディレクトリ名部分を削除する)
 ファイル名を取り出すには System.IO.Path.GetFileName を使います

・「一括操作(&D)」にサブメニュー「ファイル名を抽出」を追加
・private void ファイル名を抽出ToolStripMenuItem_Click(object sender, EventArgs e) {} というメソッドが追加されるので、
 そこに以下のコードを追加
  for (int i=0; i<textBox1.Lines.Length; i++) {
   textBox1.Lines[i] = System.IO.Path.GetFileName(textBox1.Lines[i]);
  }
 
 ところが、このコードだとコンパイルは通るものの、うまくいきません。
 Delphi だとこの方法を使って行単位で書き換えることができたのですが、どうやら C#(というより .NET Framework)での Lines プロパティは読み取り専用…というかただの配列のようです。
 というわけで、文字列配列を作成して一気に Lines プロパティに代入するように変更します

  string[] lines = (string[])textBox1.Lines.Clone();
  for (int i = 0; i<lines.Length; i++) {
   lines[i] = System.IO.Path.GetFileName(lines[i]);
  }
  textBox1.Lines = lines;

 あるいは単に、単一の文字列を生成してから Text プロパティに代入してもOKです。
 
  string text = "";
  for (int i=0; i<textBox1.Lines.Length; i++) {
   text += System.IO.Path.GetFileName(textBox1.Lines[i]) + System.Environment.NewLine;
  }
  textBox1.Text = text;


■拡張子を削除する
 拡張子の削除は System.IO.Path.ChangeExtension を使います
 
・「一括操作(&D)」にサブメニュー「拡張子を削除」を追加
・private void 拡張子を削除ToolStripMenuItem_Click(object sender, EventArgs e) {} というメソッドが追加されるので、
 そこに以下のコードを追加
 
  string[] lines = (string[])textBox1.Lines.Clone();
  for (int i = 0; i<lines.Length; i++) {
   lines[i] = System.IO.Path.ChangeExtension(lines[i], null);
  }
  textBox1.Lines = lines;

 Win32Api の PathRenameExtension ではピリオドを含む拡張子を対象としていましたが、System.IO.Path.ChangeExtension はピリオドを含まない部分を対称にするので気をつけましょう
 もし System.IO.Path.ChangeExtension("filename.ext", ""); としてしまうと、末尾にピリオドが残ってしまいます



次回はソート機能を追加します
posted by JUNOSOFT at 21:15| Comment(0) | プログラミング

2013年08月12日

ファイル名が欲しい3

前回作った雛形で、「ファイルをドロップしてファイルパスを得る」 という、最低限欲しかった機能がすでに付いているのですが、あまりにも使いづらいので、そのあたりを改善してみようと思います。

■長い行が勝手に折り返されてしまう
 ファイル名の一覧などは1行1項目が見やすいのですが、デフォルト状態だと長い行が右端で折り返されて見づらいため、まずはこの機能をOFFにします
 
 ・フォーム上に配置してあるテキストボックスを選択
 ・メニューから 表示→プロパティウィンドウ を選択してプロパティウィンドウを表示
 ・プロパティウィンドウの WordWrap を False に変更


■複数行表示したとき、文字の位置がガタガタになる
 ファイル名はピリオドなどの小さな記号を含んでいますし、似たようなパス名を持つであろうファイル名を複数表示するわけですから、縦方向(列方向)に文字の位置がそろっていたほうが何かと見やすくなります
 そんなわけで、デフォルトで設定されている可変ピッチフォント(プロポーショナルフォント」)はあまり良くありません。
 これを固定ピッチフォント(等幅フォント)に変えてみましょう。

 ・フォーム上に配置してあるテキストボックスを選択
 ・プロパティウィンドウの Font をクリック
 ・サブ項目が展開されるので、そこにある Name 項目の値を 「MS ゴシック」に変更
 ・この状態で実行(F5)し、フォントが変化していることを確認


■メニューを追加する
 これからさまざまな機能を追加するので、今のうちにメインメニューを追加しておこうと思います
 
 ・ツールボックス(無ければ表示→ツールボックスで表示)の「メニューとツールバー」にある MenuStrip をダブルクリック
 ・フォームに空っぽのメニューが追加されるので、「ここへ入力」と書いてある場所に 「ファイル(&F)」と入力(&Fは必ず半角にする。&記号を忘れずにつけておくこと)
  → & と F を並べて書いておくと F に下線がつき、Alt+Fを押すことでメニューが選べるようになる
 ・同じ要領で「ファイル(&F)」の下にサブメニュー「終了(&X)」を追加
 ・この状態で実行(F5)し、ウィンドウにメニューがちゃんとついていることを確認


■メニューを選択したときの動作を追加する
 いま追加したメニューは見た目だけで、選んでも何もおきません。というわけで、メニューが選択されたときの動作を追加します

 ・「ファイル(&F)」をクリック
 ・サブメニューが出るので、「終了(&X)」をダブルクリック。これにより 終了XToolStripMenuItem_Click のような名前のメソッドが追加される(メニューを追加したときに最初に入力した名前から記号を除いたものが、メソッド名の先頭に勝手に付く。今回は「終了(&x)」という名前を入力していたので、先頭に終了X])
 ・追加された 終了XToolStripMenuItem_Click メソッドの中に

  Close();

  という行を追加
 ・この状態で実行(F5)し、ファイル→終了メニューでウィンドウが閉じることを確認


■少しはマシになった?
ひとまず、これで土台が完成しました。最低限の機能と、最低限の見た目を備えています。
次からはファイル名に対する一括処理の機能を追加していくことにします。
posted by JUNOSOFT at 09:43| Comment(0) | プログラミング

2013年08月07日

ファイル名が欲しい2

とりあえず C# を使ってファイル名取得ツールの土台を一気に作ってみようと思います。
必要な手順だけを箇条書きにしたので、参考にしてみてください。


■プロジェクトの新規作成
・まず C# を起動
・「ファイル」→「新しいプロジェクト」→「Windowsフォームアプリケーション」を選択し、適当なプロジェクト名を入力して決定
・この状態で実行(F5)し、なにもないフォームが表示されることを確認


■テキストボックスを追加
・ツールボックス(表示→ツールボックス)から TextBox を選んでダブルクリックし、フォーム上に1行サイズのテキストボックスを配置
・配置されたテキストボックス上で右クリックし、メニューからプロパティを選択
・プロパティ一覧の MultiLine を True に変更(複数行の編集に対応させるため)
・プロパティ一覧の Dock を Client に変更(ウィンドウいっぱいの大きさにし、ウィンドウサイズの変更に対応させるため)
・この状態で実行(F5)し、テキストが自由に編集できることを確認


■ファイルのドラッグドロップを受け入れる
・フォームを選んだ状態でプロパティを出し、AllowDrop を True にする(ドロップ動作を許可するため)
・フォームを選んだ状態でプロパティを出し、雷マークのついたボタンをクリックし、イベント編集モードにする
・イベント一覧から DragDrop をダブルクリックしてイベントを追加。これにより Form1_DragDrop というメソッドが追加される
・追加された Form1_DragDrop メソッドに
  e.Effect = DragDropEffects.All;
 という行を追加

・フォームのイベント一覧から DragEnter をダブルクリック。これにより Form1_DragEnter というメソッドが追加される
・追加された Form1_DragEnter メソッドの中に
  if (e.Data.GetDataPresent(DataFormats.FileDrop)) {
   foreach (string path in (string[])e.Data.GetData(DataFormats.FileDrop)) {
    textBox1.Text += path + System.Environment.NewLine;
   }
  }
 という行を追加
 
■確認
あっけないかもしれませんが、以上で基本形は出来上がりです。F5で実行し、適当なファイルをドラッグドロップしてみてください。もちろん複数ファイルにも対応しています。

次回、もう少し機能を追加していくことにします
posted by JUNOSOFT at 05:23| Comment(0) | プログラミング

2013年08月04日

ファイル名がほしい


プログラムをしていると、フォルダ内のファイル名一覧がテキスト形式で欲しくなる時があります。
もちろん、適当なフォルダをドロップするとファイル名一覧を作成してくれるツールはいくつかあるのですが、自分にとっては少し使いにくかったので、簡単なツールを作ってみることにしました。
ついでにその製作過程を載せておきます。

まず、欲しい機能は以下のとおり。

・見た目はメモ帳みたいにシンプルで、テキストを自由に編集できる
・そこにフォルダをドロップすると、フォルダ内の全てのファイル名がフルパスで追加される
・そこにファイルをドロップすると、そのファイル名がフルパスで追加される
・カーソル行のファイル(フォルダ名ならそれを、ファイル名ならその親フォルダを)エクスプローラで開くことができる
・カーソル行のファイルを OPEN できる
・以下の操作を、すべての行または選択された範囲内に対して一括で適用できる
  ファイル名だけを抽出(=パス部分を削除)
  拡張子を削除
  拡張子を変更
  実際に存在するファイル名だけを残し、あとは削除
  ファイル名順でソート
  拡張子順でソート
  末尾に \ がなければ、追加
  末尾に \ があるなら、削除
  ファイルに対してリンクするようなHTMLソースを生成

以上の要求を満たすツールをC#でサクッと作ってみたいと思います
posted by JUNOSOFT at 18:49| Comment(0) | プログラミング