Archive for 1 月, 2012

.netで実行状況を表示しながらファイルをコピーする第3の方法

C#, コードサンプル No Comments »

おそらく知っている人は昔から知っていたであろう、ただし海外サイトを含めてもほとんど解説されていない手法を発見、または再発見したので、ここに残しておくこととします。

どなたかの役に立てれば幸いです。

第3の方法を解説する前に、第1と第2について触れておきます。

第1は言うまでも無くWin32APIの利用です。具体的にはxp以前はshfileoperation、vista以降だとifileoperationです。

この方法がもっとも確実かつ高速ですが難解です。

やたらめったら定数をたくさん定義してあれこれ調整しないと使えるようになりません。

.netでC#とかVB、あるいはjavaとかの高級言語しか触ってない人間にとっては面倒くさいことこの上なし。

コードサンプルはたくさんあるものの、使い方もわかりにくい。

というわけでおそらく皆、このAPIを使う方法はできれば避けたいはず。

第2の方法はVBのMy機能(Microsoft.VisualBasic.FileIO)を使うことです。

実態はWin32API(shfileoperation)のwrapperですが、第1の方法とは違い、ファイルのコピーを1行で書けるので、非常に重宝します。

C#でもVBのdllを参照で追加すれば使えます。

これで全部解決したかのように思えますが、大きな制限が一つあって、ファイルのコピーにしても移動にしても削除にしても、ファイルを1つずつしか処理できません。

小さいファイルを大量に処理する場合などオーバーヘッドが大きく速度的な面で使い物になりません。

番外としてはProgressBarなどを自力で実装する方法などもありえますが、そんなことするくらいだったらWin32APIを使ったほうがまだマシというものです。

また、2007年のMSDNマガジンでMSの中の人によるifileoperationの.net用wrapperが公開されているのですが、ライセンスがかなり厳しく、自分で試す分にはいいとしても、そのほかの用途にはいろいろと厳しそうです。

そして今回の第3の方法ですが、これはShell機能をC#から呼び出すというものです。

おそらくShell32.dllからでも使えるはずですが、C#でcomのshell32.dllを参照に追加すると漏れなくshell.interop.dllが生成されてしまって気持ち悪いので、別の方法を考えます。

今回はPowerShellを使った方法を書きます。ただし、同様の手法がWSH、VBScriptなどでも使えるようです。

System.Management.Automation.dllを参照に加えておきます。

最初に貼り付け、または移動したいファイルをクリップボードに貼り付けます。

クリップボードにファイルをコピーまたは切り取りする方法はその辺で探してください。

クリップボードに格納したら、PowerShellでシェルのpasteコマンドを実行します。

using System.Management.Automation;

using (var pInvoker = new RunspaceInvoke())
{
pInvoker.Invoke("$objShell = new-object -comobject shell.application");
pInvoker.Invoke("$objShell.NameSpace(17).ParseName(\""
+  "xxxxxxxx"
+ "\").InvokeVerb(\"paste\")");
}

"xxxxxxxx"の部分はファイルのコピー先を絶対パスで指定してください。

以上で完了です。

My機能との違い

1

複数ファイル・フォルダを一度に処理できる

2

My機能では表示ダイアログをオプションによりエラーのみなどと指定できたが、この方法では指定できずエクスプローラーでのコピーと同じになる。

これでファイルのコピーと移動は問題なくなりましたが、ファイルの削除はMy機能と同じく1ファイルまたは1フォルダごとの処理になってしまい、複数ファイル・フォルダを一度に削除しようとすると、相変わらずWin32APIを利用するしかありません。

うまいことShellFolderItemsを任意のファイルとフォルダから生成できればいいんでしょうが、これが難しい。

削除機能はしょうがなくMy機能を利用しております。

OOMを新しくOOM2にグレードアップする計画

OOM, 今後の予定 No Comments »

私以外に誰もこのソフトを使ってはいないのではなかろうかと思っている今日この頃です。

設定ファイルの作成・更新ツールにかなり酷いバグを見つけましたが、これまで報告がないということは、きっと誰も使っていないということなのでしょう。

もともと自分一人のために使い始めたソフトで、世の中にはもっと高機能で便利なファイラーが山盛りあるので当然といえば当然なわけですが。

しかしそんな超マイナーファイラーの名を欲しいままにするこのソフトもそろそろ大改修の予定です。

具体的には、.netのFormsアプリケーションからWPFアプリケーションになります。

仕組みはほぼ同じですが、機能的には少し削ります。

これまでは指定フォルダーのショートカットのみをアイコン表示する簡易ランチャータブを搭載していましたが、これを削除することにします。

理由は簡易ランチャーをここ1年ほど使っていないということと、WPFにはFormsのようにデフォルトでアイコン表示できるコントロールが存在しないからです。

MSからサンプルでカスタムコードが公開されていますが、組み込むのが大変すぎです。

各種処理が全体的にスピードアップしたり、一部はスピードダウンしたりします。

Windows8にあわせて.net4.5でビルドしてWindows7以上必須のアプリとして出そうかと思っています。

Metroにはなりません。というかできません。

ホットワード フリーソフト 公開 ファイラ
割引クーポンまとめ情報 - クー割