Delphi с использованием Lockfile на Windows 7 64
Вопрос
Я обнаружил, что если вы откроете файл, который находится на 32-битном сервере в папке акций из 64-битной машины Windows 7, прочитайте его, заблокируйте его, а затем откройте его снова. Когда вы закрываете все открытые ручки, файл на самом деле остается открытым.
Точные шаги:
Поместите файл, который находится между 7000 и 10000 байтами длиной в общей папке на 32-битной машине Windows, мы используем Windows Server 2003.
Составьте следующий код для Win32, чтобы он проводится под WOW64. Обратите внимание, что я пропустил попробовать .. Финально, декларации и т. Д. Для простоты.
(См. Фрагмент кода ниже; ошибка 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 при открытии файла во второй раз или если вы не читаете файл перед его блокировкой.
Кто-нибудь заметил это раньше или узнать, как решить это, без использования файла_flag_no_buffering? Пожалуйста, не то, чтобы он произошел только, когда 64-битный клиент Windows открывает файл таким способом на 32-битной машине Windows, он не возникает с 32-битным или 64Т до 64.
Решение
ОК проблема решена.
Похоже, NOD32 X64 вызывал проблему. Добавление всех возможных путей в папку (все сети сетевых путей и сопоставленные диски) в список исключения с подстановочным знаком *, а затем перезагрузка ПК исправила его.
Во всяком случае, спасибо за вашу помощь.