• ベストアンサー

vb.net コピーの進捗をプログレスバーで

質問ばかりでもうしわけないのですが タイトルにあるようにコピーの状況を プログレスバーで表示できたらなと思い作成したのですが うまく動きません。 プログレスバー自身単独では動くのですがコピーと合わせると フリーズしてしまいます。 プログラミング経験と発想力が乏しいのでご教授いただけたら幸いです Private Sub Bt_1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Bt_1.Click Dim fname1 As String = "C:\フォルダ名A" Dim fname2 As String = "C:\フォルダ名B" Dim ber1 As Integer If IO.Directory.Exists(fname1) = True Then Me.Lb_1.Text = "テキスト文字" For ber1 = 0 To 20 Me.ProgressBar1.Value = ber1 System.IO.File.Copy("コピー元テキストファイルA", "コピー先テキストファイルA", True) My.Computer.FileSystem.CopyDirectory("コピー元フォルダA", "コピー先フォルダA", True) My.Computer.FileSystem.CopyDirectory("コピー元フォルダB", "コピー先フォルダB", True) Next ber1 If IO.Directory.Exists(fname2) = True Then System.IO.File.Copy("コピー元ファイルB", "コピー先ファイルB", True) End If MessageBox.Show("終了報告テキスト", "タブ名") ' System.IO.Directory.Delete("コピー元", True) Me.ProgressBar1.Value = 0 Application.Exit() こんな感じで作成しております。 ファイル自身が1GBぐらいあるので フリーズしていないかプログレスバーや%表示でしらせたいので 教えていただけると助かります。 よろしくお願いします。

質問者が選んだベストアンサー

  • ベストアンサー
  • mako_tyo
  • ベストアンサー率37% (61/161)
回答No.1

難しいですね・・・ 私は、VBはできませんが読むならって程度ですが。。。 ファイルのコピーを行う処理が重たくて、進度を表示したいというのはわかります。 なぜループと質問者さんのソースでのコピーでは、プログレスバーの動きが違うかというと、ループでは100回転するとしたら100回同じ場所を通るので、何回通ったというのが分かるのですが、コピーだとコピーの処理で1回となります。なのでコピーの場合は、コピーが終了したらプログレスバーがすべて動きます。(説明へたでスミマセン) そこで、調べたのですがマルチスレッドで処理を行うっていいみたいです。 リンク先で議論?されてるみたいなので参考程度にお願いします。 何もわからなくてすみません。。。 orz

参考URL:
http://homepage1.nifty.com/MADIA/vb/vb_bbs2/200506/200506_05060090.html
coin_1983
質問者

補足

回答ありがとうございます。 リンク先を読んだのですが 初心者の私にはさっぱりです・・・ PC自体は8割シングルですので作成するのは 時間がかかりそうですね・・・・ 情報ありがとうございました。

その他の回答 (2)

回答No.3

System.IO周りを探ってみましたが、非同期のファイルコピーは見当たりませんでした。 どうしても自アプリ内でプログレスを動かしたい場合、2つの方法を思いついたので挙げておきます。 方法1:ファイルコピーを自力で行う コピー元ファイルを開き、コピー先ファイルを空で用意します。 コピー対象のファイルから一定量読み取り、コピー先へ書き込み、プログレスバーを進めます。これを繰り返すことで進捗状況がわかります。 ただし、ファイルの属性や更新日・最終アクセス日がコピーした時点の日時になるなどの自力で調整しないといけない部分があります。 イメージとしては、ファイルをアプリで開き「名前をつけて保存」で別名を指定しているのと同じ。 方法2:WinAPIを使う CopyFileExというAPIを使うと、APIが進捗状況をコールバック関数に送ってきてくれます。一般的にはこっちの方法が使われていると思います。 VB6.0であれば実行できますが.NETでは試したことがありません。また、コピーを中止する手続きも自分で用意する必要があります。特にコールバック関数を使うあたりが > まったくの初心者レベル とおっしゃっているので、かなり敷居が高いかと思われます。

coin_1983
質問者

補足

遅れましてすみません やはりAPIですか・・・ 敷居が高いので自分で能力を高めて 挑戦してみたいと思います。 情報ありがとうございました。

  • KG_
  • ベストアンサー率62% (34/54)
回答No.2

FileIO.FileSystem.CopyFile メソッドを使用すれば 普通に操作でコピーしたときのようなダイアログは表示させることが できますので参考までに。

coin_1983
質問者

補足

そうなのですか!? まったくの初心者レベルなので 助かります。 さっそく試してみます。 情報ありがとうございます。

関連するQ&A