Windows Server 2008 R2、Windows Server 2008、または Windows Server 2003 R2 で DFSR が有効に設定されている共有フォルダに Excel ファイルを上書き保存した場合にファイルが消失することがある

現象

Windows Server 2008 R2、Windows Server 2008、または Microsoft Windows Server 2003 R2 で、DFS Replication (DFSR) が有効に設定されている共有フォルダー上の Excel など一時ファイルを利用するアプリケーションのファイルを開き、上書き保存を実施した場合に、オリジナルのファイルが消失し、一時ファイルのみが残されることがあります。



なお、この現象は、Excel と同様のファイル保存処理が実装されている場合、Excel 以外のファイルでも発生する可能性があります。

原因

この現象は、DFSR による複製処理と Excel などによるファイルの上書き処理が、干渉するために発生します。

DFSR は DFSR が有効に設定された共有フォルダー上のファイルに変更が加えられた事を検出すると、レプリケーション パートナーにそのファイルを複製します。この処理は以下のように実施されます。
  1. 共有上のファイルに変更が加えられた事を DFSR が検出します。
  2. レプリケーション パートナーにファイルが変更された事を通知します。
  3. レプリケーション パートナーからの複製要求を受け、DFSR はファイルの複製内容を Staging Folder へとコピーします。
  4. Staging Folder にコピーされた内容が、レプリケーション パートナーの Staging Folder へと複製されます。
  5. レプリケーション パートナーは Staging Folder に複製されてきた内容を結合し、元ファイルと入れ替えます。
上記の処理 3 および 処理 5 で、DFSR は DFSR 共有上の元ファイルに対してアクセスします。この時、DFSR は元ファイルに対してのハンドルを確保します。このタイミングでアプリケーションがこのファイルにアクセスした場合に問題が発生することがあります。

回避策

この問題を回避するには、アプリケーション側で、リトライなどのエラー ハンドリングを実装してください。DFSR は、ファイルに加えられた変更を複製するため、ファイルに対してのハンドルを確保する必要があるため、 DFSR により一時ファイルが使用中となる可能性があるためです。また、 一時ファイルの拡張子として既定で DFSR による複製対象外の .tmp を使用するように実装することでも問題を回避することができます。

アプリケーション側での対応ができない場合には、以下のいずれかの方法で、DFSR による複製処理とアプリケーションによる上書き処理が干渉することを回避してください。

方法 1 : 共有フォルダーで DFSR を行わない

共有フォルダーで DFSR による複製を行わないようにしてください。Robocopy 等の別の方法により、同期を取るようにしてください。

方法 2 : DFSR のレプリケーション スケジュールを変更する

DFSR のレプリケーション スケジュールを夜間のみなどに変更し、上書き保存中にレプリケーションが実施されないよう設定してください。DFSR の複製のスケジュールは、以下の手順で変更してください。
  1. [DFS の管理] コンソールを起動します。
  2. 左側のペインから [レプリケーション] を展開し、レプリケーション対象を右クリックし、[レプリケーション グループ スケジュールの編集] をクリックします。
  3. スケジュールの編集画面より、夜間のみなど、ファイルの上書きが実施されない時間帯のみにレプリケーションされるよう、レプリケーションさせない時間帯をドラッグ アンド ドロップによって選択し、[帯域幅使用率] から [レプリケーションなし] を選択します。
  4. [OK] をクリックします。
  5. レプリケーション対象サーバーの DFS Replication サービスを再起動します。
注 : 複製を停止した時間帯では、DFS フォルダー ターゲット間でファイルの整合性が取られていない状態となるため、DFS の設定でフォルダー ターゲットの紹介を 1 台のみで有効にします。

詳細

DeleteFile 関数では FILE_DISPOSITION_INFORMATION を設定する事により、ファイルの削除を設定しますが、FILE_DISPOSITION_INFORMATION でファイル削除が設定された場合、ファイルへの全てのハンドルが開放されるまで実際のファイルが削除されません。



DeleteFile() が STATUS_SUCCESS で終了した場合にも、ファイルへのハンドルが保持されている場合には、実際のファイルはまだ削除されずに存在しているため、その後、実施する MoveFile() が、STATUS_NAME_COLLISION により失敗します。さらにその後、元ファイルへのハンドルが全て開放されたタイミングで元ファイルは削除されるため、最終的には元ファイルが削除され、一時ファイルのみが残ってしまう状態となります。



本現象は、DeleteFile 関数が実行されるタイミングに依存して発生します。マイクロソフトでは、この問題が Excel 2003 以前のバージョンで発生することを確認しています。Excel 2007 以降では、一時ファイルの拡張子が .tmp であり、この拡張子は既定で DFSR の複製対象外となっています。.tmp ファイルのハンドルは、DFSR により保持され無いため、Excel 2007 以降では、この現象は発生しません。 しかし、たとえば、ウィルス スキャン ソフトなど、DFSR 以外のプロセスが対象のファイルのハンドルを開いている場合など別原因で、同様の現象が発生することがあります。


また、Excel は以下のようにファイルの上書き保存を実施します。
  1. Excel にて xls ファイルを開くと、一時ファイルが作成されます。
  2. ファイルの上書き保存を実施した場合、その変更内容はまず一時ファイルに書き込まれます。
  3. 書き込みが完了した後、一時ファイルと元ファイルの置き換えが行われます。
この置き換えは、最初 ReplaceFile API によって行われますが、これがエラーとなる場合、DeleteFile と MoveFile API を組み合わせたリトライ処理が実行されます。

本現象は、このリトライ時の処理で行われる DeleteFile API による元ファイルの削除処理で、DFSR が元ファイルのハンドルを保持している場合に発生することを確認しています。また、 Excel の動作上 ReplaceFile API を実行した時に、一時ファイルのハンドルが DFSR により保持されている場合にも同様の現象が発生することがあります。

Excel の場合、オリジナルのファイルが削除された場合でも、最新の同じ情報が、一時ファイルとして残ります。そのため、本現象が発生した場合、一時ファイルに拡張子 .xls をつけることで直前まで編集作業中だったファイルを参照することができます。

関連情報

Excel のファイル保存方法については、次のサポート技術情報、または次のマイクロソフト Web サイトを参照してください。
814068 Excel のファイル保存方法について
プロパティ

文書番号:968102 - 最終更新日: 2016/10/04 - リビジョン: 1

フィードバック