Вопрос

Я обнаружил, что если вы откроете файл, который находится на 32-битном сервере в папке акций из 64-битной машины Windows 7, прочитайте его, заблокируйте его, а затем откройте его снова. Когда вы закрываете все открытые ручки, файл на самом деле остается открытым.

Точные шаги:

  1. Поместите файл, который находится между 7000 и 10000 байтами длиной в общей папке на 32-битной машине Windows, мы используем Windows Server 2003.

  2. Составьте следующий код для Win32, чтобы он проводится под WOW64. Обратите внимание, что я пропустил попробовать .. Финально, декларации и т. Д. Для простоты.
    (См. Фрагмент кода ниже; ошибка StackoverFlow не делает код не правильно форматировать код, когда он находится внутри списка)

  3. Запустите приложение на 64-битной машине Windows. Файл должен быть на 32-битной машине, мы используем Windows Server 2003, ошибка не возникает, если файл находится на 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;

Проблема идет не происходит, если вы используете флаг File_Flag_no_buffering при открытии файла во второй раз или если вы не читаете файл перед его блокировкой.

Кто-нибудь заметил это раньше или узнать, как решить это, без использования файла_flag_no_buffering? Пожалуйста, не то, чтобы он произошел только, когда 64-битный клиент Windows открывает файл таким способом на 32-битной машине Windows, он не возникает с 32-битным или 64Т до 64.

Это было полезно?

Решение

ОК проблема решена.

Похоже, NOD32 X64 вызывал проблему. Добавление всех возможных путей в папку (все сети сетевых путей и сопоставленные диски) в список исключения с подстановочным знаком *, а затем перезагрузка ПК исправила его.

Во всяком случае, спасибо за вашу помощь.

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top