Правильное отображение SearchRec.size

Вопросы программирования и использования среды Lazarus.

Модератор: Модераторы

Правильное отображение SearchRec.size

Сообщение dvpt » 28.06.2009 17:58:22

Создаю список файлов в ListView
но SearchRec.size выдает какието несусветные размеры.
Код: Выделить всё
// Список файлов
procedure ListViewFls(strPath: string; ListView: TListView; ImageList: TImageList);
var
  i: Integer;
  SearchRec: TSearchRec;
  ListItem: TListItem;
  attr : String[5];
begin
  attr := '12345';
  ListView.Items.BeginUpdate;
  ListView.Items.Clear;
  try
   i := FindFirstUTF8(strPath + '*.*', faAnyFile, SearchRec); // search for the first file
    while i = 0 do begin
      with ListView do begin    // On directories and volumes
        if ((SearchRec.Name <> '.') and
           (SearchRec.Attr and FaVolumeID <> FaVolumeID)) then begin
          ListItem := ListView.Items.Add;
          if (SearchRec.Attr and FaDirectory = FaDirectory) then
            ListItem.ImageIndex := 0
           else
            ListItem.ImageIndex := 1;
          ListItem.Caption := SearchRec.Name;   //FileInfo.szDisplayName;
          ListItem.SubItems.Add(inttostr(SearchRec.size div 1024));
          ListItem.SubItems.Add(datetimetostr(FileDateToDateTime(SearchRec.time)));
          if (SearchRec.Attr and FaDirectory = FaDirectory) then attr[1] := 'D' else attr[1] := '_';
          if (SearchRec.Attr and FaArchive = FaArchive)     then attr[2] := 'A' else attr[2] := '_';
          if (SearchRec.Attr and FaHidden = FaHidden)       then attr[3] := 'H' else attr[3] := '_';
          if (SearchRec.Attr and FaReadOnly = FaReadOnly)   then attr[4] := 'R' else attr[4] := '_';
          if (SearchRec.Attr and FaSysFile = FaSysFile)     then attr[5] := 'S' else attr[5] := '_';
          ListItem.SubItems.Add(attr);
        end;
      end;
      i := FindNextUTF8(SearchRec);
    end;
    FindCloseUTF8(SearchRec);
  finally
    ListView.Items.EndUpdate;
  end;
end;


не могу найти причину. В Delphi все работает нормально.
dvpt
новенький
 
Сообщения: 38
Зарегистрирован: 18.03.2009 11:46:04

Re: Правильное отображение SearchRec.size

Сообщение Mr.Smart » 28.06.2009 18:58:12

В чём заключается ваше "какието несусветные размеры."
У меня размеры выдаются в Винде (я так понимаю у вас проблемы именно с Виндой) такие как они есть!

Добавлено спустя 55 секунд:
fpc 2.2.4 Win32
Mr.Smart
долгожитель
 
Сообщения: 1796
Зарегистрирован: 29.03.2008 01:01:11
Откуда: из леса!

Re: Правильное отображение SearchRec.size

Сообщение dvpt » 28.06.2009 19:27:15

После преобразования inttostr(SearchRec.size) размер файла не совпадает с реальным.
В Linux еще не проверял.
dvpt
новенький
 
Сообщения: 38
Зарегистрирован: 18.03.2009 11:46:04

Re: Правильное отображение SearchRec.size

Сообщение Mr.Smart » 28.06.2009 21:45:53

Ваш пример у меня работает без ошибок.
Mr.Smart
долгожитель
 
Сообщения: 1796
Зарегистрирован: 29.03.2008 01:01:11
Откуда: из леса!

Re: Правильное отображение SearchRec.size

Сообщение dvpt » 29.06.2009 05:19:04

ОК, видимо надо скачать новый Lazarus и FPC
dvpt
новенький
 
Сообщения: 38
Зарегистрирован: 18.03.2009 11:46:04

Re: Правильное отображение SearchRec.size

Сообщение Mr.Smart » 29.06.2009 06:37:23

Lazarus здесь не причём. Вы пользуетесь функциями из RTL, которые имеют отношение только к FPC.
А вообще ошибка в размере будет только в том случае если размер файла больше чем 2^32. Т.е. больше чем 4 гигагабайта.
Если обратить внимание на поле структуры TSearchRec с именем FindData - это те данные о элементе каталога, которые нам возвращает сама Windows. В структуре FindData размер представлен двумя полями: NFileSizeLow - младшие 4 байта размера и NFileSizeHigh - соответственно старшие. В FPC размер берётся без учёта NFileSizeHigh т.е. Size=NFileSizeLow.

Добавлено спустя 8 минут 19 секунд:
Щас посмотрел исходники FPC 2.3.1, а там данная феничка исправленна и в учёт берутся все 8 байт размера size:=NFileSizeLow+(qword(maxdword)+1)*NFileSizeHigh;
Mr.Smart
долгожитель
 
Сообщения: 1796
Зарегистрирован: 29.03.2008 01:01:11
Откуда: из леса!

Re: Правильное отображение SearchRec.size

Сообщение dvpt » 29.06.2009 11:25:15

Скачал и установил Lazarus-0.9.27-20762-fpc-2.2.5-20090629-win32
Все заработало правильно.
dvpt
новенький
 
Сообщения: 38
Зарегистрирован: 18.03.2009 11:46:04


Вернуться в Lazarus

Кто сейчас на конференции

Сейчас этот форум просматривают: Google [Bot] и гости: 12

Рейтинг@Mail.ru