none
ファイルコピー時の元のファイルの状態について RRS feed

  • 質問

  • いつもお世話になっております。

    現在、バッチを作ってファイルをコピーしようと思っています。
    VBScriptを使おうと考えており、FileSystemObjectのcopyfileやcopyfolderでコピーしようと思っています。

    タイトルは、ファイルコピー時の元のファイルの状態についてというものですが、
    実際には以下の点が気になっています。

    1.ファイルコピーの際、自分自身(コピーするバッチ自体)もコピー対象になるのですが、問題ないでしょうか。

    2.ファイルコピーの対象が、別のバッチ(*.vbsとか*.exeとか)になることもあるのですが、コピー中にコピー元を実行(または実行中にコピー)しても問題ないでしょうか。

    3.コピー元のファイルを別のプロセスが開くこともあると思うのですが、このとき、読み込みモードならオープンしても問題ないでしょうか。
    書込みモードだとエラーになり、読み込みモードだとエラーにならなかったのですが。

    当方にてある程度の実験は可能ですが、Windowsの動作に詳しいかたがいらっしゃいましたら原理を教えていただけるとありがたいです。
    実験+理論で大丈夫だと言えればいいので、原理と言ってもそれなりにで構いません。
    例えば、コピーは読み込みモードで開いているのと同じだから大丈夫だよとか(←根拠のない例ですので合ってるかどうかわかりません)。

    よろしくお願いします。
    2010年2月8日 13:30

回答

  • ハッシュドビーフさん、こんにちは。

    ご質問の件に対して、問題あるか無いかは、何をしたいかにも依ると思います。
    コピーが正常に実行される、もしくは実行が正常に終了するか否かを心配されているのであれば、大丈夫と思いますが。。。

    参考になるかどうか分かりませんが、関連のありそうなサイトをお伝えしておきます。

    ファイルロック - 実装 - Windows
    http://ja.wikipedia.org/wiki/%E3%83%95%E3%82%A1%E3%82%A4%E3%83%AB%E3%83%AD%E3%83%83%E3%82%AF

    >プログラムとして実行されているファイル(例えば、EXE、COM、DLL、CPLなど)は、
    >一般にライト/削除アクセスのためのオープンができないようファイルシステムが制限し、
    >共有違反(sharing violation)が報告される。しかし、ある種のアクセスは許されている。
    >例えば、実行中アプリケーションのファイルを改名したりコピー(リード)したりすることは可能である。

    Windows Vista SP1 でのファイル コピー機能強化の詳細
    http://technet.microsoft.com/ja-jp/windows/ee909526.aspx

    上記ページの中に記述されているProcessMonitorを使用すると、実際の動きが掴めるかもしれないので、
    試してみてはどうでしょう。

    あまり良いアドバイスとは言えませんが・・・少しでも参考になれば幸いです。

    もし、何かしらアドバイス出来る方がいらっしゃいましたら、ご投稿の程、よろしくお願いします。


    マイクロソフト株式会社 フォーラム オペレーター 高橋春樹
    2010年2月15日 9:19
  •  ファイルを開くときに、どの様に共有できるかを指定するフラグがあります(FileShare 列挙体, CreateFile 関数の「共有モード」)。このフラグをどの様に指定するかによって、多重オープンの要求結果は変わります。


    Jitta@わんくま同盟
    2010年2月16日 12:23
  • >1.ファイルコピーの際、自分自身(コピーするバッチ自体)もコピー対象になるのですが、問題ないでしょうか。

    バッチの実行を司るスクリプト処理系の実装によって結果は異なります。

    かなり多くのスクリプト処理系が、スクリプト実行に際してスクリプトファイルをすべてメモリに読み込んでから実行を開始する実装になっていると思います。

    この場合、スクリプトの実行開始後なら、そのスクリプトファイルを他のプロセスで読み取ることはできるはずです。
    ですが、スクリプト処理系がスクリプトファイルを読み込むごく短い期間、他プロセスからスクリプトファイルを開くことができない時間が生じるかもしれません。(実際どうなのかは、スクリプト処理系の実装に依存)

    また、スクリプト処理系によっては、スクリプト実行中、スクリプトファイルを他プロセスから開けない状態にキープするものもあるかもしれません。

    >2.ファイルコピーの対象が、別のバッチ(*.vbsとか*.exeとか)になることもあるのですが、コピー中にコピー元を実行(または実行中にコピー)しても問題ないでしょうか。

    1 同様、バッチの実行を司るスクリプト処理系の実装によって結果は異なります。

    >3.コピー元のファイルを別のプロセスが開くこともあると思うのですが、このとき、読み込みモードならオープンしても問題ないでしょうか。
    >書込みモードだとエラーになり、読み込みモードだとエラーにならなかったのですが。

    既にコメントがついていますが、例えば API レベルでファイルを読み書きする際、読み書きのモード指定以外に他プロセスによるファイルオープンの可否を指定することができます。

    書き込みモードでファイルが開かれているとしても、他プロセスからの読み取りを許可する設定になっていれば、他プロセスから開くことができます。

    ただし、ファイルへの書き込を行うプロセスと読み取りを行うプロセスの間で、なんからの手段で同期処理を行わなければ、整合性の取れていない、書きかけのデータを読み取ってしまいます。

    2010年2月16日 14:12

すべての返信

  • ハッシュドビーフさん、こんにちは。

    ご質問の件に対して、問題あるか無いかは、何をしたいかにも依ると思います。
    コピーが正常に実行される、もしくは実行が正常に終了するか否かを心配されているのであれば、大丈夫と思いますが。。。

    参考になるかどうか分かりませんが、関連のありそうなサイトをお伝えしておきます。

    ファイルロック - 実装 - Windows
    http://ja.wikipedia.org/wiki/%E3%83%95%E3%82%A1%E3%82%A4%E3%83%AB%E3%83%AD%E3%83%83%E3%82%AF

    >プログラムとして実行されているファイル(例えば、EXE、COM、DLL、CPLなど)は、
    >一般にライト/削除アクセスのためのオープンができないようファイルシステムが制限し、
    >共有違反(sharing violation)が報告される。しかし、ある種のアクセスは許されている。
    >例えば、実行中アプリケーションのファイルを改名したりコピー(リード)したりすることは可能である。

    Windows Vista SP1 でのファイル コピー機能強化の詳細
    http://technet.microsoft.com/ja-jp/windows/ee909526.aspx

    上記ページの中に記述されているProcessMonitorを使用すると、実際の動きが掴めるかもしれないので、
    試してみてはどうでしょう。

    あまり良いアドバイスとは言えませんが・・・少しでも参考になれば幸いです。

    もし、何かしらアドバイス出来る方がいらっしゃいましたら、ご投稿の程、よろしくお願いします。


    マイクロソフト株式会社 フォーラム オペレーター 高橋春樹
    2010年2月15日 9:19
  •  ファイルを開くときに、どの様に共有できるかを指定するフラグがあります(FileShare 列挙体, CreateFile 関数の「共有モード」)。このフラグをどの様に指定するかによって、多重オープンの要求結果は変わります。


    Jitta@わんくま同盟
    2010年2月16日 12:23
  • >1.ファイルコピーの際、自分自身(コピーするバッチ自体)もコピー対象になるのですが、問題ないでしょうか。

    バッチの実行を司るスクリプト処理系の実装によって結果は異なります。

    かなり多くのスクリプト処理系が、スクリプト実行に際してスクリプトファイルをすべてメモリに読み込んでから実行を開始する実装になっていると思います。

    この場合、スクリプトの実行開始後なら、そのスクリプトファイルを他のプロセスで読み取ることはできるはずです。
    ですが、スクリプト処理系がスクリプトファイルを読み込むごく短い期間、他プロセスからスクリプトファイルを開くことができない時間が生じるかもしれません。(実際どうなのかは、スクリプト処理系の実装に依存)

    また、スクリプト処理系によっては、スクリプト実行中、スクリプトファイルを他プロセスから開けない状態にキープするものもあるかもしれません。

    >2.ファイルコピーの対象が、別のバッチ(*.vbsとか*.exeとか)になることもあるのですが、コピー中にコピー元を実行(または実行中にコピー)しても問題ないでしょうか。

    1 同様、バッチの実行を司るスクリプト処理系の実装によって結果は異なります。

    >3.コピー元のファイルを別のプロセスが開くこともあると思うのですが、このとき、読み込みモードならオープンしても問題ないでしょうか。
    >書込みモードだとエラーになり、読み込みモードだとエラーにならなかったのですが。

    既にコメントがついていますが、例えば API レベルでファイルを読み書きする際、読み書きのモード指定以外に他プロセスによるファイルオープンの可否を指定することができます。

    書き込みモードでファイルが開かれているとしても、他プロセスからの読み取りを許可する設定になっていれば、他プロセスから開くことができます。

    ただし、ファイルへの書き込を行うプロセスと読み取りを行うプロセスの間で、なんからの手段で同期処理を行わなければ、整合性の取れていない、書きかけのデータを読み取ってしまいます。

    2010年2月16日 14:12
  • いつもお世話になっております。
    まとめて返信させていただきます。

    高橋 春樹様

    >コピーが正常に実行される、もしくは実行が正常に終了するか否かを心配されているのであれば、大丈夫と思いますが
    まさにその部分が知りたかったのです。そして

    >>例えば、実行中アプリケーションのファイルを改名したりコピー(リード)したりすることは可能である。
    の部分が探していたものです。
    調査不足でした。

    アプリケーションが先に実行されている場合はおそらく上記のような形ではないかと思われますが、
    2つ目のリンクより
    >Windows では、コピー元とコピー先の双方のファイルをキャッシュ モードで開き、
    のキャッシュモードがよくわかりませんでした。

    とりあえず調べてみます。
    ありがとうございました。


    Jitta様

    そのモードは知りませんでした!
    今度使用してみようと思います。
    回答ありがとうございました。


    渋木宏明様

    スクリプト処理系の実装によるということですね。
    開くことができれば問題ないし、開くことができなければエラーになるのであれば、なんとか実装というか運用方法が
    ありそうです。
    しかし実行中にコピーするのはなかなか難しそうですね。
    もう少し勉強しないとわからなそうです。
    回答ありがとうございました。
    2010年2月22日 12:02