我已经发现,如果您从64位windows 7机器打开位于共享文件夹中的32位服务器上的文件,请读取它,锁定它,然后再打开它。当您关闭所有打开的句柄时,文件实际上仍然是打开的。
具体步骤如下:
(请参阅下面的代码片段;StackOverflow错误在列表中不能正确格式化代码)
这是代码:
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到bit或64t到64不发生这种情况。
发布于 2010-10-15 00:00:12
好的问题解决了。
似乎是Nod32 x64引起了这个问题。使用通配符*将所有可能的路径添加到文件夹(所有网络路径和映射驱动器)到排除列表中,然后重新启动PC已经修复了它。
不管怎样,谢谢你的帮助。
https://stackoverflow.com/questions/3783929
复制相似问题