// Список файлов 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 все работает нормально.
В чём заключается ваше "какието несусветные размеры." У меня размеры выдаются в Винде (я так понимаю у вас проблемы именно с Виндой) такие как они есть!
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;