外部プロセス を起動する!
書き慣れれば、とても、便利ですね。
でも、後に続く 処理によっては、
留意すべき点があります。
LocalDB を使った DataBase プログラムでは厄介な事が生じます。
DataBase(以下 DB と省略)は自動で開いたり閉じられたりするのでしたね。
だから、該当ファイルを弄るには、LocalDB そのものを確実に止めなければいけません。
参考: VB LocalDB ファイル操作 続編
同じ理由から、
外部プロセスで立ち上げた Robocopy のファイルコピーも気を付けないと。
特に、後続の作業が予定されている場合には 要注意 ですね。
外部プロセスでは、待機や終了 を考慮する必要があります。
協調させるのは、留意が不可欠なのですね。
最初は、単に、
Dim p As New Process
p.Start()
で突っ走っていました。
でも、もし、その直後で、Rename の必要性が生じれば ... 。
バックアップファイルをコピーし、それを改名する、 そんなシナリオです。
Dim p As New Process
p.Start()
IO.FILE.Move(fileA, fileB)
バックアップは常に直近の1世代のみとし、
履歴を別フォルダに、日付をサブフォルダに取って、格納する心算です。
バックアップと現行データは、同一フォルダに置いています。
Debug していると、エラーが発生しました!。
あれぇ、間違っていない筈なのに ... 。
原因は、ファイルがコピー生成される前に改名しようとする事態に陥っていた事 ... 。
コードの通り、順番で実行される訳ではありません。
プロセスを立ち上げれば、実行は次に移り、
プロセスの実行結果が反映されるか否かは、別問題ですから。
そう、この1行を忘れていたのです。
p.WaitForExec()
或いは、
p.WaitForExec(5000) ' 5s
私は良く Robocopy を別プロセスで立ち上げています。
大抵は、改名が直後に続く事は無く、
結果を画面表示させて、成り行きを確認しています。
何かで、大抵の Process 起動は 5s で賄えるのがベターと読んだ記憶があるのですが ... 。
長くなると想定される場合には、別途、検討が必要なのでしょう。.
でも、今回は、
例外発生させない対策さえちゃんと取れていれば、
自動実行が可能で、且つ、
表示した後で、別ウインドウを閉じるのも、自動化が可能な状況です。
例えば、こんな。 (随分と端折った例ですが ... )
Dim p As New Process
p.Start()
p.WaitForExec(10000) ' 10s
p.kill()
IO.FILE.Move(fileA, fileB)
この例で、結果の別ウィンドウが 10秒間 表示される訳では無い事に注意して下さい。
走り出してから消える迄が 凡そ 10秒間 です。
結果そのものが 10秒間 見れるでは無い事に留意です。
また、 起動した処理が 10秒で 終わるか否かは、また、別の問題なので、
闇雲に、数値を与えない方が良いのかも知れませんが ... 。 環境依存しますし。
0 件のコメント:
コメントを投稿