• ベストアンサー

大量データコピー中に他の処理をさせたい

VBでフォルダーをコピーするプログラムをつくりましたが、フォルダのコピー中は他のプログラムでの表示の更新処理などができません。うまく他のプログラムにも制御がいくような良い方法はないでしょうか? コピーはFileSystemObject.CopyFolder で実行しています。 よろしくお願いします。

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

  • ベストアンサー
  • todo36
  • ベストアンサー率58% (728/1234)
回答No.4

SHFileOperationはどうでしょう? エクスプローラのコピペと同じように、"コピーしています"の画面が表示されます。 呼出側が真っ白になることはないようです。

参考URL:
http://www.vbvbvb.com/jp/gtips/0951/gSHFileOperationFoCopy.html
lala123
質問者

お礼

さっそくSHFileOperationなるものをMSDNでみてみました。 なんと英語!自分の力で使いこなせるかな? ありがとうございます。

lala123
質問者

補足

参考URLをみるのを忘れてました。ありがとうございます。

その他の回答 (3)

  • TAGOSAKU7
  • ベストアンサー率65% (276/422)
回答No.3

さらに、こちらから質問です。 >大量データコピー中に他の処理をさせたい 他の処理とは主にどのようなことですか? ただ、進捗状況を表示したいだけですか? 僕の経験上、大量データ処理最中に、別プロセスを極力働かさないように設計することが多いのですが・・・ 同時に行いたい処理が何なのかが知りたいです。

lala123
質問者

お礼

度々ありがとうございます。 やりたいのはA.EXEでメニュー画面を表示。 メニュー画面には・データコピー・データグラフ表示等のボタンがある。 データコピークリック時にはB.EXEでデータをコピーする。 コピー中でもA.EXEのメニューからデータグラフ表示を行う。といったかんじです。 AutoRedraw=falseだったのでtrueにしてもだめでした。

  • TAGOSAKU7
  • ベストアンサー率65% (276/422)
回答No.2

「現在コピー中です」と表示させているのは、どちらのEXEですか? メインのEXEを「A.EXE」 コピーを実際に行っているEXEを「B.EXE」 としたとき、どちらのEXEでしょうか? もしA.EXEなら、フォームのプロパティ[AutoRedraw]はTrueになってますか? もし、B.EXEならプロセス監視が必要かも? どちらも未検証です。

  • TAGOSAKU7
  • ベストアンサー率65% (276/422)
回答No.1

CopyFolderはコピーを終了するまで、次の処理を行うのは不可能です。 CreateThreadで本来は行うべきなのでしょうが、VBはシングルスレッド言語なので、たぶん落ちまくるでしょう。 別プロセスにしてみてはいかがでしょう? 簡単にいうと別のEXEです。コピーをするだけの単機能EXEを用意して Call Shell("hogehoge.exe c:\Program Files\hoge\/c:\hoge\") などとして[hogehoge.exe]呼び出し、その[hogehoge.exe]でCommand関数で "c:\Program Files\hoge\/c:\hoge\" 部分を認識させて、コピーを行うだけの処理をさせたらよいのでは?

lala123
質問者

お礼

さっそくのご教示ありがとうございました。さっそく別EXEでやってみましたら、なんとか少し(さくさくは動きません)はうごいているのですが「現在コピー中です」と表示しているウィンドウの上にエクスプローラなどを表示し、最小化すると下にあった「現在コピー中です」の文字や色が消えて真っ白になってしまいます。とほほ・・ これはもうあきらめでしょうか?度々恐縮ですが、もし良い方法をご存知でしたらお教えください。

関連するQ&A

  • フォルダのコピー

    こんにちわ。takaoPRと申します。 今、指定したフォルダから指定したフォルダへのコピーをするプログラムを作成しているのですが、思う処理ができずに、困っています。 最初、FileSystemObjectのCopyFolderを使用したところ、読取専用ファイルのコピー時にエラーが出るので、 Win32APIの、「SHFileOperation」を使用しましたが、フォルダの上書きと読取専用ファイルの上書きで確認ダイアログが表示されてしまいます。 実現したい処理は、何のメッセージも出さずに(重複ファイルは勝手に上書きします)フォルダごとコピーをしたいのですが、実現する方法はないのでしょうか? 申し訳ありませんが、みなさまのお知恵をお借りできれば嬉しいです。宜しくお願い致します。

  • 他アプリの処理を待つには

    VisualBasic2008expressを使っています。 VBで作ったプログラムからインターネットエクスプローラーの検索ボックスのハンドルを取得し、文字列を送信、実行して検索結果を表示した後、また新しい文字列の送信と検索実行を繰り返すプログラムを作ろうとしています。検索を繰り返させるまではできました。 しかし、文字列の送信と検索を実行した後にsleep()を入れているのですが、これだと検索の更新処理の途中で新しい検索をしてしまうので検索結果の表示まで処理されない場合が出てしまいます。 他アプリケーションの更新処理が終わるまで待ち、結果が表示されたらまた新しく文字列の送信と検索実行を繰り返すということができるでしょうか。

  • VB6 CommonDialog フォルダ上書きコピー

    VB6 で CommonDialog を使用し、指定先にフォルダをコピーしたいのですが 同じ名前のフォルダが有る場合、上書き確認が表示されずフォルダ配下に 移動してしまう。 On Error GoTo AAA CommonDialog1.Flags = cdlOFNOverwritePrompt CommonDialog1.ShowSave Set cFso = New FileSystemObject Call cFso.CopyFolder(フォルダ元パス, CommonDialog1.FileName, False) Exit Sub AAA: ファイルの場合は確認ダイアログが開いたのですが、上記の場合上書きも出来ません。 コピー処理が違うのでしょうか?教えて下さい。(コピーは出来ました) ファイルの場合 ⇒ FileCopy フォルダ元パス, CD1.FileName で処理しました。

  • VBScript でサブフォルダも含めて、フォルダごとコピーを実行するには?

    バックアップの自動化をもくろんでいます。 VBScriptを用意し定刻に実行するようにしようと考えています。 VBScript でサブフォルダも含めて、フォルダごとコピーを実行するには、どうプログラムをかけばよいでのしょうか? Set objFS = CreateObject ("Scripting.FileSystemObject") objFS.CopyFolder "c:\test1", "c:\test2", false だとtest1の中のサブフォルダはコピーしてくれませんでした。 ここでオプションか何かで、サブフォルダーごとコピーしたいのです。 参考までにコマンドプロンプトの xcopy c:\test1 c:\test2 /x と同じ働きをさせたいのです。 よろしくお願い致します。

  • フォルダをコピー フォルダの中に入れたい FSO

    vbaです。よろしくお願いします。 Sub Sample() Dim myFSO As Object Dim MyPath As String MyPath = "C:\Users\ああああ\Desktop\" Set myFSO = CreateObject("Scripting.FileSystemObject") myFSO.CopyFolder MyPath & "コピーしたフォルダーを入れるフォルダー", MyPath & "コピーするフォルダ" Set myFSO = Nothing End Sub こんな感じで、デスクトップにある、"コピーするフォルダ"をコピーして、 デスクトップにある、"コピーしたフォルダーを入れるフォルダー"の中に入れたいのですが 上記のコードを実行しても何も起きません。 コピーしたフォルダーを入れるフォルダーの中身を見ても、空です。 ”コピーしたフォルダーを入れるフォルダー”の中に、"コピーするフォルダ" を入れる方法を教えてください。

  • フォルダコピーで失敗したファイル名をログに取得したい

    こんにちは。 フォルダのコピーをVBスクリプトを使って出来ないか検討しています。 条件は 1. コピーするフォルダにはファイルやサブフォルダが複数存在している 2. コピー途中でエラー(コピー出来ないファイルがあった場合等)が発生した場合はそのファイルをスキップして処理を継続する。 3. エラーの対象となったファイルまたはフォルダ名をログに出力する。 試しにVBスクリプトで作成してみましたが、これだとコピー処理が成功or失敗しか分かりません。 イメージ的には、コピー元のフォルダ内の各ファイルの情報を取得して、ひとつひとつのファイル毎にループ制御を使ってコピー処理を行いその際に正常にコピーしたかどうかをチェック出来ればと考えています。 以下のソースは上記の条件を満たしていませんが、(参考になりませんが)参考として載せました。 スクリプトはまだまだ未熟なので、よろしくお願いします。 'エラーが発生しても次のステップに進むための宣言 On Error Resume Next 'FileSystemObjectオブジェクトを作成 Set objFS = CreateObject("Scripting.FileSystemObject") 'WScript.Shellオブジェクトを作成 Set objShell = CreateObject("WScript.Shell") 'ログファイルの作成 set strLog = objFS.CreateTextFile("C:\Errlog.log", True) 'フォルダコピー If objFS.FolderExists("c:\aaa") = False Then objFS.CreateFolder("c:\aaa") objFS.copyFolder "c:\aaa", "c:\bbb" If Err.Number <> 0 Then MsgBox(Err.Number & " " & Err.Description) End If strLog.WriteLine "コメント" Else objFS.copyFolder "c:\aaa", "c:\bbb" strLog.WriteLine "コメント" End If

  • エクセルマクロでフォルダのコピーがしたい

    こんにちわ 色々調べてフォルダのコピーはできたのですが、色々いじっていて分からないことが出てきたので質問に来ました。 やりたいことはフォルダをコピーしたいのですが、それぞれ名前を自動で変えようと思い下記(1)を元に下記(2)を作ってみましたが、動きませんでした。 (1)いくつかのサイトを見て動いたマクロ sub test() Dim myFSO As New FileSystemObject myFSO.CopyFolder "C:\test", "C:\test2" End Sub (2)ちょっといじって動かないマクロ sub test() Dim myFSO As New FileSystemObject Dim name As String Dim name2 As String name = "C:\test" name2 = "C:\test2" myFSO.CopyFolder "name", "name2" End Sub 「パスが見つかりません」と出てきたので、読み込んでいないのだとは思うのですが、どうしたら動くかアドバイスをいただきたいです。 よろしくお願いします。

  • 実行させた処理の終了を待ちたいのに・・・

    VB.NETで、とても困っています。 現在実行中のアプリから別のアプリをCreateObjectで起動して、その起動したアプリに対してイベントを行うというプログラムを作っています。 処理手順としては、 (1)アプリを実行 (2)実行したアプリ内のあるプロパティをちょっと変更  (表示名称を変えるとか、そのくらいの処理です) これだけのことなのですが、(2)の実行がうまく出来ません。 ところが、(1)と(2)の間に、(1)のアプリのプロパティを取得してメッセージボックスを表示、などといった、処理を中断させる処理を挿入すると、思ったとおりのことが出来るようになります。 つまり、(1)の処理が完全に終わっていないうちに(2)のイベントを発生させようとしているようです。 こういう場合、VB6.0のときはDoEventsで解決したのですが、VB.NETではなぜか解決できません。 何か他に方法はないものでしょうか? メッセージボックスを挿入する手段は使えませんので、何とかしなくてはいけないのですが。 よろしくお願いします。

  • VBで別のプログラムを起動し他の処理を中断したい

    VBプログラムの実行中に、shell("hoge.exe")で別のプログラムを起動しそのプログラムが終了すれば次の処理に移るという処理をしたいんですが、実現方法がわかりません。どうすればよいでしょうか?アドバイスよろしくお願いします。

  • ファイルコピーの制御について

    ファイルコピーの制御について お世話になります。VB2010でプログラムの開発をしています。 皆様にお伺いしたいのは、ファイルコピーの制御が実装できるかという ことです。 サイトなどで調べると実装は難しいようですが、ライセンスコードなどを 記載しているconfigファイルをコピーできなくしたいのです。 難しいようであれば、当該configファイルがオリジナルか、コピーされた ものかを判断できるという方法でもかまいません。 「オリジナル」というのは、VBプログラムからStreamWriterなどを使って 書き出したファイルを指します。 どうぞ、よろしくお願い致します。

専門家に質問してみよう