首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >在windows 7 64上使用LockFile的Delphi

在windows 7 64上使用LockFile的Delphi
EN

Stack Overflow用户
提问于 2010-09-24 02:54:10
回答 1查看 1.9K关注 0票数 1

我已经发现,如果您从64位windows 7机器打开位于共享文件夹中的32位服务器上的文件,请读取它,锁定它,然后再打开它。当您关闭所有打开的句柄时,文件实际上仍然是打开的。

具体步骤如下:

  1. 将一个长度在7000到10000字节之间的文件放在32位windows机器上的共享文件夹中,我们使用的是Windows 2003。
  2. 为Win32编译了以下代码,以便在WOW64下运行。请注意,为了简单起见,我遗漏了try..finally、声明等。

(请参阅下面的代码片段;StackOverflow错误在列表中不能正确格式化代码)

  • 在64位windows机器上运行应用程序。该文件必须位于32位计算机上,我们使用windows server 2003,如果该文件位于64位server.

  • Terminate -您的application.

  • If上,则不会发生错误。您现在打开服务器上的计算机管理器(控制面板->计算机管理),查看文件所在的共享文件夹中打开的文件,您将看到您的文件仍然处于打开状态。

这是代码:

代码语言:javascript
复制
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不发生这种情况。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2010-10-15 00:00:12

好的问题解决了。

似乎是Nod32 x64引起了这个问题。使用通配符*将所有可能的路径添加到文件夹(所有网络路径和映射驱动器)到排除列表中,然后重新启动PC已经修复了它。

不管怎样,谢谢你的帮助。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/3783929

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档