我发现如果您从64位Windows 7计算机上打开位于共享文件夹中的32位服务器上的文件,请将其读取,锁定然后再次打开。当您关闭所有打开的句柄时,文件实际上保持打开状态。
具体步骤如下:
在32位Windows计算机上的共享文件夹中放置长度介于7000和10000之间的文件,我们使用的是Windows Server 2003。
为Win32编译以下代码,使其在WOW64下运行。请注意,为了简单起见,我错过了try..finally,声明等 (请参阅下面的代码片段; StackOverflow错误在列表中没有正确格式化代码)
在64位Windows计算机上运行该应用程序。该文件必须位于32位机器上,我们使用的是Windows Server 2003,如果该文件位于64位服务器上,则不会出现该错误。
终止您的申请。
如果您现在打开服务器上的计算机管理器(控制面板 - >计算机管理)并查看文件所在的共享文件夹中打开的文件,您将看到您的文件仍处于打开状态。
这是代码:
procedure CauseFileLockBug(FileName: PChar);
var
FileHandle1: LongInt;
FileHandle2: LongInt;
Buffer: Pointer;
BytesRead: Cardinal;
begin
FileHandle1 := CreateFile(
FileName,
GENERIC_READ or GENERIC_WRITE,
FILE_SHARE_READ or FILE_SHARE_WRITE,
nil,
OPEN_EXISTING,
FILE_FLAG_RANDOM_ACCESS,
0);
if FileHandle1 > 0 then
begin
try
GetMem(Buffer, 1);
try
if ReadFile(FileHandle1, Buffer^, 1, BytesRead, nil) then
begin
if LockFile(FileHandle1, 6217, 0, 1, 0) then
begin
try
FileHandle2 := CreateFile(
FileName,
GENERIC_READ or GENERIC_WRITE,
FILE_SHARE_READ or FILE_SHARE_WRITE,
nil,
OPEN_EXISTING,
FILE_FLAG_RANDOM_ACCESS,
0);
if FileHandle2 > 0 then
begin
CloseHandle(FileHandle2);
end;
finally
UnLockFile(FileHandle1, 6217, 0, 1, 0);
end;
end;
end;
finally
FreeMem(Buffer);
end;
finally
CloseHandle(FileHandle1);
end;
end;
end;
如果在第二次打开文件时使用FILE_FLAG_NO_BUFFERING标志,或者在锁定文件之前没有读取文件,则不会出现问题。
有没有人注意到这一点或知道如何解决它,而不使用FILE_FLAG_NO_BUFFERING?请注意,只有当64位Windows客户端在32位Windows机器上以这种方式打开文件时才会发生这种情况,不会发生32位或64位到64位。
答案 0 :(得分:0)
好的问题解决了。
似乎Nod32 x64导致了这个问题。使用通配符*将所有可能的路径添加到文件夹(所有网络路径和映射的驱动器)到排除列表,然后重新启动PC已修复它。
无论如何,谢谢你的帮助。