質問

64ビットWindows 7マシンから共有フォルダーの32ビットサーバーにあるファイルを開くと、読んでロックしてから再度開くことがわかりました。すべてのオープンハンドルを閉じると、ファイルは実際には開いたままです。

正確な手順は次のとおりです。

  1. 32ビットWindowsマシンの共有フォルダーに長さ7000〜10000バイトのファイルを配置し、Windows Server 2003を使用しています。

  2. win32の次のコードをコンパイルして、wow64の下で実行するようにします。簡単にするために、私は試してみて、宣言などを見逃したことに注意してください。
    (以下のコードフラグメントを参照してください。StackOverFlowバグは、リスト内にあるときにコードを正しくフォーマットしません)

  3. 64ビットWindowsマシンでアプリケーションを実行します。ファイルは32ビットマシン上にある必要があります。WindowsServer2003を使用します。ファイルが64ビットサーバー上にある場合、バグは発生しません。

  4. アプリケーションを終了します。

  5. これで、サーバー上のコンピューターマネージャー(コントロールパネル - >コンピューター管理)を開き、ファイルが存在する共有フォルダーの開いたファイルを確認した場合、ファイルがまだ開いていることがわかります。

これはコードです:

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;

ファイルを2回開くときにFile_flag_no_bufferingフラグを使用する場合、またはロックする前にファイルを読み取らない場合、問題は発生しません。

file_flag_no_bufferingを使用せずに、これにこれに気づいたか、それを解決する方法を知っている人はいますか? 64ビットWindowsクライアントが32ビットWindowsマシンでこの方法でファイルを開く場合にのみ発生することではなく、32からビットまたは64T〜64で発生しません。

役に立ちましたか?

解決

OK問題が解決しました。

NOD32 X64が問題を引き起こしているようです。フォルダー(すべてのネットワークパスとマッピングドライブ)にすべての可能なパスを除外リストに追加し、PCを再起動すると修正されました。

とにかくあなたの助けをありがとう。

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top