• ベストアンサー

Visual Basic Express Editionでの常駐ファイルコピー

プログラムには素人ですが Visual Basic Express Editionで下記のようなソフトは簡単にできるのでしょうか。 2つのフォルダー間の3ファイルの同期させたい。 入力指定は フォルダー名とファイル名3個 どちらかのフォルダーのファイルスタンプ(1分以内に数回更新される)が変更があると即座にこぴーする常駐ソフトであること。 簡単にできるのなら、VBかVCでつくりたいのです。よろしく。

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

  • ベストアンサー
  • nda23
  • ベストアンサー率54% (777/1415)
回答No.5

<HTML><TITLE>ファイル監視</TITLE> <SCRIPT LANGUAGE='VBSCRIPT'></SCRIPT> <BODY><TABLE> <TR><TD COLSPAN='3' ALIGN='CENTER'>ファイル監視</TD></TR> <TR ALIGN='CENTER'><TD></TD><TH>送出側</TH><TH>受取側</TH></TR> <TR><TH>ファイル1</TH> <TD><INPUT TYPE='FILE' NAME='FILE' SIZE='60'></TD> <TD><INPUT TYPE='FILE' NAME='FILE' SIZE='60'></TD></TR> <TR><TH>ファイル2</TH> <TD><INPUT TYPE='FILE' NAME='FILE' SIZE='60'></TD> <TD><INPUT TYPE='FILE' NAME='FILE' SIZE='60'></TD></TR> <TR><TH>ファイル3</TH> <TD><INPUT TYPE='FILE' NAME='FILE' SIZE='60'></TD> <TD><INPUT TYPE='FILE' NAME='FILE' SIZE='60'></TD></TR> <TR><TD><INPUT TYPE='BUTTON' VALUE='開始' ID='B1' ONCLICK='EXEC'> </TD><TD COLSPAN='2'><INPUT TYPE='BUTTON' VALUE='終了' ID='B2' ONCLICK='STP = True' DISABLED></TD></TR> <TR><TD></TD><TD COLPAN='2'> <TEXTAREA ID='LOG' COLS='45' ROWS='5' READONLY></TEXTAREA> </TD></TR> </TABLE></BODY> <SCRIPT LANGUAGE='VBSCRIPT'> Option Explicit Dim FSO, CTL, EXE, TRM, TMR Dim STP, ZEN(), I, J, T, S Dim LOG 'ロギング領域 Set FSO = CreateObject("Scripting.FileSystemObject") Set CTL = Document.GetElementsByName("FILE") Set EXE = Document.GetElementById("B1") Set TRM = Document.GetElementById("B2") Set LOG = Document.GetElementById("LOG") Sub EXEC() For I = 0 To 5   If Trim(CTL(I).Value) = "" Then     MsgBox "ファイル名が未入力です", vbCritical, "エラー"     CTL(I).Focus     Exit Sub   End If Next For I = 0 To 5   CTL(I).ReadOnly = True Next ReDim ZEN(2) LOG.Value = "" EXE.Disabled = True TRM.Disabled = False STP = False TMR = SetTimeout("KANSHI", 100, "VBScript") End Sub Sub KANSHI() ClearTimeout TMR For I = 0 To 4 Step 2   On Error Resume Next   T = CTL(I).Value   If FSO.FileExists(T) Then     J = I / 2     S = FSO.GetFile(T).DateLastModified     If S <> ZEN(J) Then       ZEN(J) = S       FSO.CopyFile T, CTL(I + 1).Value, True       If Err.Number = 0 Then         T = T & "をコピーしました" & vbNewLine         LOG.Value = LOG.Value & T         LOG.ScrollTop = 999999       End If     End If   End If   On Error GoTo 0   If STP Then     For J = 0 To 5       CTL(J).ReadOnly = False     Next     EXE.Disabled = False     TRM.Disabled = True     Exit Sub   End If Next TMR = SetTimeout("KANSHI", 100, "VBScript") End Sub </SCRIPT> </HTML> ★長くなるので、タグやプログラムは詰めて記述しました。  後で分かり易いように編集してください。 ★字下げのため、漢字空白を使っています。コピペ後、漢字空白を  半角空白×2に変換してください。 ★簡素化のため、色やフォントは指定していません。適宜、体裁を  整えてください。 ★横着したのでファイル1~3は全て左から右へのコピーです。  間違え易いとお考えの場合は適当に修正してください。 ★初回は前回情報が無いので、必ずコピーします。 ★コピーした時だけログを出すようにしています。実行時間が長く  ログの負荷が大きくなりそうなら、削除してください。

noname#182544
質問者

お礼

ありがとうございます。 作動することができました。VBSCRIPTなので、ほかにも応用のきく良い回答です。 早い対応でありがとうございました。感謝します。

その他の回答 (5)

  • nda23
  • ベストアンサー率54% (777/1415)
回答No.6

追伸 念のため、使い方をお知らせします。 先のプログラムをテキストエディタにコピペ、漢字空白→半角空白 その後、拡張子を.HTAとしてファイルに保存してください。 実行する時はエクスプローラでHTAファイルをダブルクリックすれば OKです。

  • nda23
  • ベストアンサー率54% (777/1415)
回答No.4

先ずは体裁から。 2個のフォルダと3個のファイル、都合6個のパスはどのように 指定させるつもりですか?(コマンドライン or 画面) 画面なら、HTAがお勧めです。ブラウザがあれば即座に実行できます。 ソーステキスト(HTMLみたいなもの)だけで、ネイティブコードは なく、頒布する際に、RunTimeなど何も必要ではありません。 次はコピーのルールです。Aフォルダ⇒Bフォルダのような一方的な ものなら、特に問題ないのですが、双方向ですと規約が必要ですし、 コピー中は更新プログラムを止めるなどの制御も必要になってきます。 このへんは解決しているのでしょうか?

noname#182544
質問者

補足

回答ありがとうございます。 1分以内に数回更新される(常駐)がネックでエクセルのVBは多少わかるからVisual Basicで簡単にできないかなと質問したのです。、 HTAがあるということは知らなかったですが、HTAで可能なら教えてほしい。 最低の必要としてるコピーのルール (1ファイルが逆方向) file 1を Aフォルダ⇒Bフォルダ へコピ- file 2を Aフォルダ⇒Bフォルダ へコピ- file 3を Bフォルダ⇒Aフォルダ へコピ- file1-3の名前はHTAを常駐させる前に書きかえる。 よろしくご教授おねがいします。

  • redfox63
  • ベストアンサー率71% (1325/1856)
回答No.3

フォルダーやファイルの監視ならSystem.IO.FileSystemWatcherクラスを使うのが妥当かもしれません

  • nda23
  • ベストアンサー率54% (777/1415)
回答No.2

内容は簡単です。すぐ作れます。 問題は常駐の形態で、単に普通のプロセスとして無限ループしながら タイムスタンプを監視する形式と、システムの一部(サービスや ドライバといった形式)で常駐させる方法があります。無論、後者は かなりの知識が必要なので、やめた方がいいでしょう。 VBやVCどころか、Scriptでも実現可能です。 尚、監視の際にはSleepを入れるのを忘れずにおいてください。 入れないとCPUタイムを恐ろしく浪費してしまいます。

noname#182544
質問者

補足

回答ありがとう。 無限ループしながらタイムスタンプを監視する形式をためしてみたい が 基本的な命令はなにを使用したらいいのですか。 VB入門書で解決できる範囲なのですか、 1.ファイルタイムスタンプの情報取得 2.Sleepの入れ方 それか、参考になるWEBでも教えてください。

  • BellBell
  • ベストアンサー率54% (327/598)
回答No.1

フォルダAのファイルA-1,A-2,A-3 フォルダBのファイルB-1,B-2,B-3 フォルダAのみが更新され、フォルダBに上書きする、という場合か、あるいは、A-1,A-2,B-3のみが更新され、それぞれ逆のフォルダへ上書きするという場合は問題なさそうです。 A-1,B-1がそれぞれ別のタイミングで更新され、タイムスタンプによって新しい方を古い方へ上書きする、という形だと問題が発生すると思われます。 例えば、A-1,B-1がほぼ同時に更新された場合、仮にB-1がほんの僅かに遅かったとして、同期を実行するとB-1への更新が上書きで消えてしまいます。 >どちらかのフォルダーのファイルスタンプが って言葉からすると、問題が発生しそうなパターンですね、おそらく。 念のために書くと、VBだから、VCだからという問題ではなく、マルチスレッドのOSでは問題が発生する可能性の高い設計だからです。 更新頻度が低ければ(数時間に1回など)、まず問題が発生しないだろうとの判断もあり得るとは思いますが。

関連するQ&A

専門家に質問してみよう