とまと あんらいぷ…

エンジニアの活動記録とかつぶやきとか

GitHub
スポンサードリンク

【.NET】CopyFileExを使ってコピーの進捗状況を取得する【WPF】

CopyFileExでコピーの進捗状況を取得する
C#でコピーの進捗状況を取得するには
API関数(kernel32.dllのCopyFileEx)を呼び出すことで実現できるけど
そのまま使うにはあまりにも.NET風じゃないので、クラス化しておいた。

相変わらずPINVOKEを利用する時は
PINVOKE.NETさんで悶絶しながら実現していくのだけど、PINVOKE.NETアドインってのがあるようだ。
便利そうだから時間があれば今度使ってみたいな。
使ってみました! → PInvoke.net Visual Studio Extensionを使ってみた

はじめてのWPFアプリケーション
今回は初めてWPFアプリケーションにしているので、GDIな書き方になってるかもしれないけど了承ください。
とはいいつつも、csのコード部分はそのまま使えるので大丈夫。

WPFで困ったのはDoEvents()がないことだった。
そもそも、今回作ったコピー処理の呼び出しを別スレッド化していないからなんだけど
コピー中に中断ボタンを有効にするためにDoEvents()メソッドを呼びだそうとしても存在しなかった。
自分で作らないとダメみたい。
こんな感じです。

Dispatcher.PushFrame メソッド

ということは、全てのメッセージ処理を行うんじゃなくて、必要な描画メッセージだけ処理しなさいよ
ってのがMSの求めるものなんだろうね。

ひとまず、呼び出し側のお作法はおいておいて、
C#側から利用したい場合のI/Fとして必要な物は
・コピー元パス、・コピー先パスを使ってコピーができること
・中断を行えること
この2点に絞って実装していきます。

怖いものなしのVB.NET
と、その前に。
VB.NETには進捗状況を取得できる機能が備わっているらしい。
ここ
進行状況を表示しながらディレクトリやファイルをコピー/移動/削除するには?(My機能活用)[2.0のみ、C#、VB]
C#でもMicrosoft.VisualBasic.dllを参照設定すれば使えるんじゃないかな。

今回はAPIで実装します。
WindowsのExplorerでコピーした際に進捗率が表示されてるけど、今回実装したクラスと処理時間がほとんど一緒だった。
そんな理由から、Explorerのコピーは同じ実装をしてるとおもいます。

では実装コード。
まずはxamlでデザインを決定


実行するとこんなデザイン
FileCopyEx_Window.png
下の方にプログレスバーがあります。

CopyFileEXのラップクラス。


使うのはCopyStart()メソッドと、進捗に変化があった時に発生するProgressChangedイベントを使っていく事になります。
後は中断ボタンが押された時に渡すCopyProgressResult列挙体ですね。
ProgressChangedイベントに渡されるCopyProgressEventArgsに、CopyProgressResultプロパティを公開しているので
このプロパティをいじってやることで継続・中断・一時停止などの命令を行えます。
ちなみにコメントにも書いてるけど、WindowsXPとWindows Vista以降で、中断処理の挙動が違うので注意。

トランザクションNTFS(TxF)っていう概念が採用されていて、ファイルコピーのトランザクション処理を行いたい場合は
CopyFileTransactedっていうAPI関数を使えとのこと。
引数はCopyFileExにトランザクションのハンドルが追加されただけだが、これまたややこしかった。
しかもやっぱり概念に無理があったようで、Windows8以降は非推奨とのこと。
今回は割愛。

呼び出し側


usingが多いです。。。
あとデザインで指定したコピー元・先のパスとコード内で記述してるパスは全く整合性ありません。
そのへんは臨機応変によろしくです。

ソリューション一式
API_FileCopyExSample

余談ですが、
中断処理を表す変数名を考えてた時に
StopedにするかSuspendにするかInterruptedにするか悩みに悩んだ結果、Stopを採用(これが正しいらしい)。
日本語でも中断、中止、停止、廃止など、取りやめる事を意味する言葉が多いこと多いこと。
言葉って難しいね。
▼この記事を読んだ方は、こんな記事も読んでいます。▼

スポンサードリンク

テーマ:プログラミング - ジャンル:コンピュータ

コメント

中断処理を意味する変数名、悩みますね。自分も最近悩みましたが、考えれば出てくるもので・・・これしかない!というのが浮かびました。Stop ももちろん考えましたが、もっといいのあるよ。
http://dalmore.blog7.fc2.com/blog-entry-46.html

  • 2013/06/05(水) 05:09:06 |
  • URL |
  • #mQop/nM.
  • [ 編集 ]

中断処理を意味する変数名

コメントありがとうございます。
その「これしかない!」を教えて下さい(笑)
ちなみにリンクがこの記事になってますが、本当は参考となるリンクを張ってくださったのだと思います。

  • 2013/06/07(金) 10:07:24 |
  • URL |
  • 管理人 #z9jllgzo
  • [ 編集 ]

コメントの投稿


管理者にだけ表示を許可する

トラックバック

トラックバック URL
http://dalmore.blog7.fc2.com/tb.php/46-e09b51c2
この記事にトラックバックする(FC2ブログユーザー)

FC2Ad