アプリ版:「スタンプのみでお礼する」機能のリリースについて

質問ばかりでもうしわけないのですが
タイトルにあるようにコピーの状況を
プログレスバーで表示できたらなと思い作成したのですが
うまく動きません。
プログレスバー自身単独では動くのですがコピーと合わせると
フリーズしてしまいます。
プログラミング経験と発想力が乏しいのでご教授いただけたら幸いです

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ぐらいあるので
フリーズしていないかプログレスバーや%表示でしらせたいので
教えていただけると助かります。

よろしくお願いします。

A 回答 (3件)

難しいですね・・・ 私は、VBはできませんが読むならって程度ですが。

。。

ファイルのコピーを行う処理が重たくて、進度を表示したいというのはわかります。
なぜループと質問者さんのソースでのコピーでは、プログレスバーの動きが違うかというと、ループでは100回転するとしたら100回同じ場所を通るので、何回通ったというのが分かるのですが、コピーだとコピーの処理で1回となります。なのでコピーの場合は、コピーが終了したらプログレスバーがすべて動きます。(説明へたでスミマセン)

そこで、調べたのですがマルチスレッドで処理を行うっていいみたいです。
リンク先で議論?されてるみたいなので参考程度にお願いします。

何もわからなくてすみません。。。 orz

参考URL:http://homepage1.nifty.com/MADIA/vb/vb_bbs2/2005 …

この回答への補足

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

情報ありがとうございました。

補足日時:2009/06/03 12:01
    • good
    • 0

System.IO周りを探ってみましたが、非同期のファイルコピーは見当たりませんでした。



どうしても自アプリ内でプログレスを動かしたい場合、2つの方法を思いついたので挙げておきます。

方法1:ファイルコピーを自力で行う
コピー元ファイルを開き、コピー先ファイルを空で用意します。
コピー対象のファイルから一定量読み取り、コピー先へ書き込み、プログレスバーを進めます。これを繰り返すことで進捗状況がわかります。

ただし、ファイルの属性や更新日・最終アクセス日がコピーした時点の日時になるなどの自力で調整しないといけない部分があります。
イメージとしては、ファイルをアプリで開き「名前をつけて保存」で別名を指定しているのと同じ。

方法2:WinAPIを使う
CopyFileExというAPIを使うと、APIが進捗状況をコールバック関数に送ってきてくれます。一般的にはこっちの方法が使われていると思います。
VB6.0であれば実行できますが.NETでは試したことがありません。また、コピーを中止する手続きも自分で用意する必要があります。特にコールバック関数を使うあたりが
> まったくの初心者レベル
とおっしゃっているので、かなり敷居が高いかと思われます。

この回答への補足

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

情報ありがとうございました。

補足日時:2009/06/04 07:22
    • good
    • 0

FileIO.FileSystem.CopyFile メソッドを使用すれば


普通に操作でコピーしたときのようなダイアログは表示させることが
できますので参考までに。

この回答への補足

そうなのですか!?
まったくの初心者レベルなので
助かります。

さっそく試してみます。
情報ありがとうございます。

補足日時:2009/06/03 13:23
    • good
    • 0

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!