図1●ファイルのコピーを実行しようとしたらエラーが出て拒否された画面
Q

Windows 2000で,ファイルを上書きコピーしようとした時に,図1のようなエラー画面が出てコピーできないファイルがあります。上書きしたいファイルの属性を確認しましたが,読み取り専用ではありません。アクセス権を見ても,だれでも自由に読み書き出る[Everyoneフルコントロール]が割り当てられています。なぜ上書きできないのでしょうか。また,強制的に上書きコピーする方法はあるのでしょうか。


図2●ファイルの属性は各ファイルのプロパティ画面から設定できる
NTFSにある[詳細]ボタンをクリックすると,アーカイブや圧縮,暗号化といった属性を指定できる。上部の[セキュリティ]タブを選べばアクセス権が設定できる。
A

ファイルの変更が拒否される場合,まずアクセス権をはじめとするファイルの属性を確認しましょう。扱える属性は,ファイル・システムによって異なりますが,例えばDOSやWindows Me/98/95で使えるFAT*ならば「読み取り専用」「隠しファイル」「システム」「アーカイブ」といった属性が付加できます。Windows XP/2000/NTで使えるNTFS*ならば,さらに「アクセス権」「圧縮」「暗号化」(2000/XPのNTFS 5.Xのみ)といった属性を付加することができます(図2)。

 これらの属性,特にNTFSを使っている場合はアクセス権を確認することが必要です。読み取り専用などの属性が設定されていれば解除し,ユーザーにアクセス権がない場合は適切なアクセス権を設定します。ただし,今回の場合は,これらの問題はありません。

 それならば,何らかの形でWindowsのシステムなどが使用中でファイルをロックしている可能性が高いと思われます。このような現象は,プログラムの実装の際にCreateFile( )関数で,ファイルをロックして開くように指定している場合に発生します。

ファイル名が変更できなければ レジストリを編集し再起動時に置換
 このような場合,もっとも手軽なのは置き換える対象となるファイルの名前を一時的に変更し,新しいファイルをコピーした後に古いファイルを削除する方法です。例えば,ABC.DLLというファイルを新しいバージョンのファイルで置き換えたい場合,まず古いファイル名をABC._BKといった名前に変更します。そして新しいABC.DLLをコピーし,問題なくコピーできたらコンピュータを再起動してABC._BKを削除します。

 ただし,ロックされていることでファイル名さえ変更できないことがよくあります。この場合は,ロックされる前にファイルを置き換えるという手段を取る必要があります。具体的には,レジストリを編集して再起動をすれば,Windowsのシステムがロックする前にコピーすることが可能です。

 まず,レジストリ・エディタ(regedt32.exe)を起動し,HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet
\Control\Session Managerキーの配下にPendingFileRenameOperationsという値を追加します。データ型はREG_MULTI_SZで,そのデータとして上段に置き換える新しいファイル名,下段に置き換えられる古いファイル名を入力します。

 例えば,c:\winnt\system32\test.sysのファイルをc:\temp\test.sysで上書きする場合は図3のように設定します。設定を変更したら,レジストリ・エディタを終了し,コンピュータを再起動すればファイルが置き換えられた状態となっているはずです。詳細は,マイクロソフト技術情報(JP181345)を参照してください。

ツールを使えば簡単かつ効率的な レジストリ編集が可能
 レジストリを手動で編集する作業が不安なユーザーは,ツールを使用するという方法もあります。入手しやすいものとしては,マイクロソフトが提供している「Inuse.exe」があります(Windows 2000用サイトWindows NT用サイト)。Inuse.exeは,使用中のファイルを置き換えるためのコマンド・ライン・ツールです。パラメータとして,置き換える新しいファイルと置き換えられるファイルを指定して実行した後に,再起動をすればファイルは置き換わっています(図4)。

 このツールはコマンド・ラインから利用するツールなので,グループ・ポリシーのスタートアップ・スクリプトなどとして利用すると,複数のコンピュータに対して同時に実行するなど効率的な作業も可能となります。ただし,このツールはマイクロソフトのサポート対象外となっているので利用にあたっては注意してください。

 そのほかの類似のツールとして,Takuya Uemura氏の「File Overwrite」(該当サイト)や,KAZA氏の「SRCpy for WIN32」(該当サイト)などがあります。

小川一元

図3●再起動時にファイルを置き換えるにはレジストリの編集が必要
新しい値を追加し,その内容として上段に置き換える新しいファイル名,下段に置き換えられる古いファイル名を入力する。

図4●Inuse.exeを使えば再起動時のファイル置換をコマンド・ラインから指定できる
コピー先のファイル名とコピー元のファイル名をフルパスで指定すると,事前に存在を確認してから確認メッセージを出す。確認すると,その内容をレジストリに反映させ,再起動時に自動的にファイルを置換してくれる。