• ベストアンサー

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

  • フォルダ内のファイルのコピーについて

    ルートフォルダとサブフォルダ内のファイルのコピーについて 教えてください。 繰り返しの処理にてサブディレクトリ内のファイル名などの取得は 可能なのですが、コピーをしようとすると「書込みできません」の エラーになってしまいます。 Fname = fsoFile.Name 全ファイル名 objFso.CopyFile iFName &"\"& Fname, oFName,True iFName と oFName はそれぞれ、ダイアログで指定したフォルダの pathが入ります。 また、フォルダコピーであれば問題なくコピーされ、ファイル名を テキストにも出力できます。 objFso.CopyFolder iFName , oFName,True objT.WriteLine Fname 以上、宜しくお願いします。

  • フォルダのコピー

    csvにかきこまれているフォルダだけ指定されたフォルダにコピーしたいのですが、StreamReaderでcsvを読み込み一行ごとにコピー処理しています。 コピー方法は、 dim di as new system.io.directoryinfo(コピー元フォルダ) for each fi as system.io.fileinfo in di.getfiles() fi.copyto(コピー先フォルダ & fi.name,true() next としています。 フォルダ数が30位で全体の容量は1.2GBぐらいです。 開始すると、応答しなくなりますが、コピーは行われました。 フリーズしてしまうのはなぜでしょうか? もっといい方法があればご指導願います。 主にネットワーク上にあるフォルダにコピーするよていです。

  • プログレスバーで処理進捗を反映させたいが・・・泣

    backgroundWorkerで重たい処理をさせたいのですが、どのようにプログレスバーを噛ませてあげたらいいのか悩んでいます。 重たい処理はこんな感じです。 (ソースが今のPCに無いので大雑把な内容でお許し下さい) このページを参考にしています。 http://www.atmarkit.co.jp/fdotnet/dotnettips/436bgworker/bgworker.h... 処理自体は仕様通りに出来ています。 どうしても大きいファイルなど操作するのでどうしても時間を要します。 そのため、ファイルコピーなどの各処理が終わるたびにプログレスバーに反映させたいのですが、参考にしているページだとforを用いたループでやっているのでどうやったらいいのか悩んでいます。 (単に想像力が足りないのかもしれませんが・・・) どのようにするといいか教えていただけませんでしょうか? //処理内容 ファイル読み込み ファイルコピー テキスト開く 1000行書きこむ(繰り返しでかけないので1行1行書き込み) テキスト閉じる ファイル読み込み ファイルコピー ファイルの内容を検査して間違いを修正 ファイルをリネーム ファイルを指定したサーバのパスにバラ撒く ・ ・ ・ ・ ・ こんな類似処理を何千回もする

  • VB2008(vb6でも可)よりVPNで接続されている

    VB2008(vb6でも可)よりVPNで接続されている 共有フォルダ内のファイル存在チェックについて。 マイネットワークで見れたので単純に考えて Dim FName As String = "\\**.***.**.***\c:\###.csv" If System.IO.File.Exists(FName) Then Debug.WriteLine(FName & " は存在します") Else Debug.WriteLine(FName & " は存在しません") End If とIPアドレスを指定したらできるかと思ったのですが 駄目でした。解決方法または参考になるサイトをご存知であれば よろしくお願いいたします。

  • Excel VBAで異なるファイル間のコピー

    異なるファイル間で値のみをコピーしたいです。下記の様な感じです。 hoge1.xlsのA1からA10のセルの値のみをhoge2.xlsのB1からB10へコピーする。 以下の様に書いてみたのですが、数式がコピーされてしまいます。 VBAをやったことがなく、今ネットで30分ほど見て書いてみたので 根本的に理解していません。簡単な書き方を教えていただきたいです。 Sub test() Dim Fname As String Fname = "hoge1.xls" Workbooks.Open Filename:=Fname, ReadOnly:=True Dim range1 As Range Set range1 = Worksheets("Sheet1").Range("A1:A10") range1.Copy Destination:=Workbooks("hoge2.xls").Worksheets("Sheet1").Range("B1:B10") End Sub また、ファイルを開いたり閉じたりは必要なのでしょうか? Workbooks.Open Filename:=Fname, ReadOnly:=True を書かずに、いきなり Set range1 = Workbooks("hoge1.xls").Worksheets("Sheet1").Range("A1:A10") はダメなのでしょうか?? よろしくお願いします。

  • vbsでファイルやフォルダのコピー中にプログレスバーを表示させるにはど

    vbsでファイルやフォルダのコピー中にプログレスバーを表示させるにはどうすればいいでしょうか。 無言でコピーするコードはいろいろと紹介されているのですが、何も表示されないので進行状況がわかるようにしたいのです。 残り時間表示やパーセント表示などどのような表示方法でもいいのでおおよその進行状況がわかる方法をご存知でしたら教えて頂けないでしょうか。 宜しくお願い致します。 <例> コピー元ファイル:"C:\test\*.*" コピー先フォルダ:"C:\backup\"

  • プログレスバーでの経過状況表示

    vb.netでのtimerのようなものをやりたくてvbaでプログレスバーを使用して経過状況を表示するプログラムを作りました。プログレスバー自体での視覚的な経過状況表示はできたのですが、現在のパーセンテージをlabelに表示することができません。 Private Sub CommandButton4_Click() Dim i As Long Application.Visible = False i = 1 For i = i To 1000000 UserForm1.ProgressBar1.Value = i / 1000000*100 UserForm1.Label1.Caption =UserForm1.ProgressBar1.Value i = i + 1E-44 Next Application.Visible = True End Sub 上記のようにするとプログラム終了時にlabel1に現在のプログレスバーの値が表示されますが、進行中には表示されないのです。これを進行中も表示させるにはどうしたら良いのでしょうか?

  • VB2008 txtファイル保存

    こんにちは、Vb2008を勉強しています。 デスクトップに保存している、TXTファイルに、 フォームで入力したデータを追加保存したいと思い、ネットで調べたり…で 入力しましたが、txtファイルを開いてみると文字化けしてしまします。 Dim writer As System.IO.FileStream = _ System.IO.File.OpenWrite("C:\Users\Desktop\顧客管理.txt") 'SystemWriterオブジェクトを作成し、テキストデータが書き込めるようにする Dim sw As System.IO.StreamWriter = New System.IO.StreamWriter(writer) 'ファイルの末尾に移動する sw.BaseStream.Seek(0, System.IO.SeekOrigin.End) 'データを書き込む sw.WriteLine(TextBox1.Text & "," & TextBox2.Text & "," & TextBox3.Text) 'ファイルを更新する sw.Flush() 'ファイルを閉じる sw.Close() writer.Close() 上記の方法で文字化けだったので、またまた、調べて入力しましたが 今度は、改行されず…単純な、データの追加のようになってしまっています。 私は、新しい行に追加できるようにしたいです。 下のコードは文字コードの指定をしたので、保存はできますが、 改行されません。 Dim FileName As String = "C:\Users\Desktop\確認.txt" Dim Writer As IO.StreamWriter Dim Encode As System.Text.Encoding '文字コードにShiftJISを指定。 Encode = System.Text.Encoding.GetEncoding("Shift-JIS") '既に存在するテキストに追加する場合は第2引数をTrueにする。 Writer = New IO.StreamWriter(FileName, True, Encode) Writer.Write(TextBox1.Text & "," & TextBox2.Text) Writer.Close() どなたか、教えていただけませんでしょうか?

  • VBでModule1からForm1のコントロールを操作したい

    VB.NETでForm1のProgressBarをForm1.VBからではなく外部Module1.vbのサブルーチンから操作する方法はありませんか。"Dim Form1 as New Form1"などとするともうひとつフォームが開いたりしてうまくいきません。現在、下記の様にしてもうひとつ別のForm2を開いてプログレスバーを表示しております。 できるなら、Form1だけで済ませたいと思っております。 勉強不足でわかりません。どなたか教えてください。 Form2.Show() Form2.ProgressBar1.Minimum = 0 Form2.ProgressBar1.Maximum = 学習回数 Form2.ProgressBar1.Visible = True For 繰り返し = 1 To 学習回数 Form2.ProgressBar1.Value = 繰り返し Form2.lbl解析中.Text = 繰り返し Form2.Label1.Update() Form2.lbl解析中.Update()      ****処理**** Next

  • 重複データを書き込まないようにするには?(VB)

    VB(2010)初心者です。 ボタンクリックで、テキストボックスに入力したデータをテキストファイルに 追加書き込みしていますが、同じデータは書き込めないようにしたいです。 下記コードにどのような記述を付け加えたら良いのでしょうか。 Dim fsFile As System.IO.FileStream = System.IO.File.OpenWrite("C:\List.txt") Dim sw As System.IO.StreamWriter = New System.IO.StreamWriter(fsFile) sw.BaseStream.Seek(0, System.IO.SeekOrigin.End) sw.WriteLine(TextBox1.Text) sw.Flush() sw.Close() fsFile.Close()

専門家に質問してみよう