Pregunta

He encontrado que si se abre un archivo que reside en el servidor de 32 bits en una carpeta para compartir desde una ventana de 64 bits 7 máquina, leen, bloquearlo y vuelva a abrirlo. Cuando se cierra todos los identificadores abiertos en realidad el archivo permanece abierto.

Los pasos exactos son:

  1. Colocar un archivo que es de entre 7000 y 10000 bytes de largo en una carpeta compartida en una máquina Windows de 32 bits, estamos utilizando Windows Server 2003.

  2. Compilar el siguiente código para Win32 para que se ejecute bajo WOW64. Tenga en cuenta que me he perdido try..finally, declaraciones, etc para mayor simplicidad.
    (Véase el siguiente fragmento de código, un error stackoverflow no codifica formato correctamente cuando está dentro de una lista)

  3. Ejecutar la aplicación en una máquina Windows de 64 bits. el archivo debe estar en una máquina de 32 bits, se utiliza Windows 2003 Server, el error no se produce si el archivo está en un servidor de 64 bits.

  4. Terminar su aplicación.

  5. Si ahora abre el gestor de equipo en el servidor (panel de control-> Administración de equipos) y vistazo a los archivos abiertos en la carpeta compartida donde reside su archivo verá que el archivo está todavía abierto.

Este es el código:

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;

El problema va no se produce si utiliza el indicador de FILE_FLAG_NO_BUFFERING al abrir el archivo de la segunda vez, o si usted no lee el archivo antes de bloquear a él.

Se ha dado cuenta de esto a nadie antes o saber cómo resolverlo, sin utilizar el FILE_FLAG_NO_BUFFERING? Por favor, no es que sólo ocurre cuando un cliente de Windows de 64 bits abre un archivo de esta forma en una máquina de 32 bits de Windows, no se produce con 32 bits o de 64 a 64T.

¿Fue útil?

Solución

Ok Problema resuelto.

Parece que Nod32 x64 fue la causa del problema. La adición de todos los caminos posibles en la carpeta (todas las rutas de red y unidades mapeadas) a la lista de exclusiones con comodín * y luego reiniciar el PC se ha fijado a él.

De todos modos gracias por su ayuda.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top