File.Copyは完了後にソースファイルをロックします
-
03-07-2019 - |
質問
サーバーから.NET 2.0アプリケーション(C#)のローカルマシンにファイルをコピーしようとしていますが、ソースファイルを不必要にロックし続けています。この動作を引き起こしているのはファイルサーバー上で構成されたものであると思われますが、何が役立つかわかりませんか?
ファイルコピー操作の後、ファイルサーバー(Windows 2K3 R2)は、サーバー上のファイルに対してそれ以上操作が行われなくても、ソースファイルが読み取りロックで保持されていることを報告します。アプリケーションが終了すると、ロックが解除されます。
以下に示す最も基本的なコードでも、動作を再現できます。
static void Main(string[] args)
{
string sourceFile = @"\\win2K3server\resource\Production\IQE\sourceFolder\iqeconsole.exe";
string destinationFile = @"d:\destinationFolder\iqeconsole.exe";
System.IO.File.Copy(sourceFile,destinationFile,true);
Console.ReadLine();
}
ロックは、 File.Copy()
行の実行中に直ちに発生し、この行が終了した後も持続します。より複雑なアプリケーションでは、 File.Copy()
を含むルーチンが終了すると(ただし、アプリケーションはまだ実行中です)、ロックが持続します。
アプリケーション全体が終了した場合にのみ、ロックが解除されます。
UNCパスの代わりにマップされたドライブを使用するように sourceFile
を変更しても、動作に違いはありません。
この動作は、ソースファイルが別のサーバーにある場合、またはローカルにある場合は発生しません。
File.Copy
の後に次の行を追加すると、ロックはすぐに解除されます:
new System.Security.Permissions.FileIOPermission(System.Security.Permissions.FileIOPermissionAccess.Read, new string[] { sourceFile }).Demand();
これは、サーバー上にこの動作を引き起こしているものがあるかのように聞こえます。サーバーにShadowProtectをMcAfeeアンチウイルスとともにインストールしています。それとは別に、Windows Serverとそのコンポーネントの上に他に何もインストールされていないように見えます。
ファイルの読み取り許可を要求することで問題が解決する理由もわかりません。
これらの質問に答えていただければ、非常にありがたいです。
- ファイルロックが持続する原因は何ですか?
- なぜ読み取り許可を要求すると問題が解決するのですか?
解決
ロックを保持しているのは、おそらくMcAfeeオンアクセススキャナーです。読み取りアクセスのみを使用する場合、バイパスされます。 Sysinternals Process Viewerツール(Microsoftから無料)を使用してそれを確認できると思います。
McAfeeのサブスクリプションが不明ですが、このファイルをスキャンしないように例外ルールを定義できます。
他のヒント
ファイルサーバーでこれを複製することはできません。
ただし、PeerSoftwareによるPeerLockを使用しているため、日和見ロックは無効になっています。