Frage

Ich habe festgestellt, dass, wenn Sie eine Datei öffnen, das befindet sich auf 32-Bit-Server in einem gemeinsam genutzten Ordner von einem 64-Bit-Windows-7-Maschine, es zu lesen, es sperrt und dann wieder öffnen. Wenn Sie alle offenen Handles schließen tatsächlich die Datei geöffnet bleibt.

Die genauen Schritte sind:

  1. Legen Sie eine Datei, die zwischen 7000 und 10000 Bytes lang in einem freigegebenen Ordner auf einer 32-Bit-Windows-Maschine ist, wir sind mit Windows Server 2003.

  2. Compile der folgende Code für Win32, so dass es läuft unter WOW64. Bitte beachten Sie, dass ich try..finally verpasst, Erklärungen, usw. Der Einfachheit halber.
    (Siehe Code-Fragment, ein Stackoverflow Fehler nicht Formatcode richtig, wenn es in einer Liste)

  3. Führen Sie die Anwendung auf einem 64-Bit-Windows-Rechner. die Datei auf einer 32-Bit-Maschine sein muß, verwenden wir Windows Server 2003, wird der Fehler nicht auftreten, wenn die Datei auf einem 64-Bit-Server ist.

  4. Beenden Sie Ihre Anwendung.

  5. Wenn Sie nun den Computer-Manager auf dem Server (Systemsteuerung-> Computerverwaltung) und Blick auf die geöffneten Dateien im gemeinsam genutzten Ordner öffnen, in dem Sie Ihre Datei befindet Sie werden sehen, dass die Datei noch geöffnet ist.

Dies ist der Code:

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;

Das Problem geht tritt nicht auf, wenn Sie die FILE_FLAG_NO_BUFFERING Flags verwenden, wenn die Datei zum zweiten Mal öffnen oder wenn Sie die Datei nicht lesen, bevor sie verriegelt wird.

Hat jemand bemerkt dies vor oder wissen, wie es zu lösen, ohne den FILE_FLAG_NO_BUFFERING mit? Bitte nicht, dass es geschieht nur, wenn ein 64-Bit-Windows-Client auf einem Bit-Windows-Rechner 32 eine Datei auf diese Weise öffnet, ist es nicht mit 32 Bit oder 64t bis 64 auftreten.

War es hilfreich?

Lösung

Ok Problem gelöst.

Scheint, wie Nod32 x64 das Problem verursacht wurde. Hinzufügen aller möglichen Pfade in den Ordner (alle Netzwerkpfade und zugeordnete Laufwerke) auf der Ausschlussliste mit Platzhalter * und dann den PC neu zu starten ist es festgelegt.

Auf jeden Fall vielen Dank für Ihre Hilfe.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top