Изменено ли поведение файлового потока в Windows 7? - PullRequest
3 голосов
/ 29 января 2010

Я написал утилиту, которая ищет в лог-файлах исключения, и она отлично работала с 64-битной Vista. Теперь я обновился до 64-разрядной версии Windows 7, и иногда она может зависнуть при чтении файлового потока. Я думаю, что он зависает, только если файл журнала активен и пользователь пишет в него. Но это хорошо работает до того, как я использую флаг fmShareDenyNone. Я использую Delphi 2007. Любая идея, что я мог бы изменить, чтобы сделать эту работу?

Вот весь метод поиска файлов журналов в каталогах:

procedure TfrmMain.Refresh;
var
  FileData : TSearchRec;  // Used for the file searching. Contains data of the file
  vPos, i, PathIndex : Integer;
  vCurrentFile: TStringList;
  vDate: TDateTime;
  vFileStream: TFileStream;
begin
  tvMain.DataController.RecordCount := 0;
  vCurrentFile := TStringList.Create;
  memCallStack.Clear;

  try
    for PathIndex := 0 to fPathList.Count - 1 do                      // Loop 0. This loops until all directories are searched through
    begin
      if (FindFirst (fPathList[PathIndex] + '\*.log', faAnyFile, FileData) = 0) then
      repeat                                                      // Loop 1. This loops while there are .log files in Folder (CurrentPath)
        vDate := FileDateToDateTime(FileData.Time);

        if chkLogNames.Items[PathIndex].Checked and FileDateInInterval(vDate) then
        begin
          tvMain.BeginUpdate;       // To speed up the grid - delays the guichange until EndUpdate

          fPathPlusFile := fPathList[PathIndex] + '\' + FileData.Name;
          vFileStream := TFileStream.Create(fPathPlusFile, fmShareDenyNone);
          vCurrentFile.LoadFromStream(vFileStream);

          fUser := FindDataInRow(vCurrentFile[0], 'User');          // FindData Returns the string after 'User' until ' '
          fComputer := FindDataInRow(vCurrentFile[0], 'Computer');  // FindData Returns the string after 'Computer' until ' '

          Application.ProcessMessages;                  // Give some priority to the User Interface

          if not CancelForm.IsCanceled then
          begin
            CancelForm.lblLogFile.Caption := fPathPlusFile;
            if rdException.Checked then
              for i := 0 to vCurrentFile.Count - 1 do
              begin
                vPos := AnsiPos(MainExceptionToFind, vCurrentFile[i]);
                if vPos > 0 then
                  UpdateView(vCurrentFile[i], i, MainException);

                vPos := AnsiPos(ExceptionHintToFind, vCurrentFile[i]);
                if vPos > 0 then
                  UpdateView(vCurrentFile[i], i, HintException);
              end
            else if rdOtherText.Checked then
              for i := 0 to vCurrentFile.Count - 1 do
              begin
                vPos := AnsiPos(txtTextToSearch.Text, vCurrentFile[i]);
                if vPos > 0 then
                  UpdateView(vCurrentFile[i], i, TextSearch)
              end
          end;

          vFileStream.Destroy;
          tvMain.EndUpdate;     // Now the Gui can be updated
        end;
      until(FindNext(FileData) <> 0) or (CancelForm.IsCanceled);     // End Loop 1
    end;                                                          // End Loop 0
  finally
    FreeAndNil(vCurrentFile);
  end;
end;

1 Ответ

5 голосов
/ 29 января 2010

Быстрый снимок: если у вас есть файл, который записывается довольно часто, как файл журнала, вы должны отключить индексацию содержимого этого файла. В противном случае служба индексирования Windows будет постоянно переиндексировать этот файл и в то же время блокировать любой другой запрос.

Атрибут индексации контекста можно найти в «свойствах файла» - «расширенные атрибуты».

ИМХО, было не лучшим решением от Microsoft включить индексирование контента в Windows 7 по умолчанию.

...