Как юзать FindFirst , FindNext для файлов размер которых выходит за integer

Модераторы: Duncon, Naeel Maqsudov, Хыиуду, Игорь Акопян

namomelkor
Сообщения: 227
Зарегистрирован: 31 авг 2006, 13:11

12 мар 2007, 11:20

sr: TSearchRec;
делаю
if FindFirst(partstr + '*.*', faAnyFile, sr) = 0 then

и тд.

sr.Size выходит за пределы integer и показывает минусовый размер
как это обойти.
Хыиуду
Сообщения: 2388
Зарегистрирован: 06 мар 2005, 21:03
Откуда: Москва
Контактная информация:

12 мар 2007, 11:54

а разве size не имеет размерность Longint?
Искусство программирования - заставить компьютер делать все то, что вам делать лень.
Для "спасибо" есть кнопка "Спасибо" в виде звездочки внизу под ником автора поста.
namomelkor
Сообщения: 227
Зарегистрирован: 31 авг 2006, 13:11

12 мар 2007, 11:57

Хыиуду писал(а):а разве size не имеет размерность Longint?
TSearchRec = record
Time: Integer;

SIZE: INTEGER;

Attr: Integer;
Name: TFileName;
ExcludeAttr: Integer;
{$IFDEF MSWINDOWS}
FindHandle: THandle platform;
FindData: TWin32FindData platform;
{$ENDIF}
{$IFDEF LINUX}
Mode: mode_t platform;
FindHandle: Pointer platform;
PathOnly: String platform;
Pattern: String platform;
{$ENDIF}
end;
Аватара пользователя
LAngel
Сообщения: 277
Зарегистрирован: 30 мар 2005, 08:19
Откуда: Ульяновск
Контактная информация:

12 мар 2007, 13:21

FindData в этой записи представляет собой системнуй запись винды:

Код: Выделить всё

  _WIN32_FIND_DATAA = record
    dwFileAttributes: DWORD;
    ftCreationTime: TFileTime;
    ftLastAccessTime: TFileTime;
    ftLastWriteTime: TFileTime;
    nFileSizeHigh: DWORD;
    nFileSizeLow: DWORD;
    dwReserved0: DWORD;
    dwReserved1: DWORD;
    cFileName: array[0..MAX_PATH - 1] of AnsiChar;
    cAlternateFileName: array[0..13] of AnsiChar;
  end;
С уважением, Lost Angel...
BBB
Сообщения: 1272
Зарегистрирован: 27 дек 2005, 13:37

12 мар 2007, 14:09

Хыиуду,
integer в Delphi - 32-разрядное число (см.Help по Delphi). Т.е., по сути, integer и longint - одно и то же.

LAngel,
видимо, ты путаешь Дельфийные (Паскалевские) функции FindFirst/FindNext и WinAPI-шные FindFirstFile/FindNextFile.
В первом случае там действительно, как и написал namomelkor параметр типа TSearchRec. А вот во втором случае все так, как написал ты (WIN32_FIND_DATA)
Аватара пользователя
LAngel
Сообщения: 277
Зарегистрирован: 30 мар 2005, 08:19
Откуда: Ульяновск
Контактная информация:

12 мар 2007, 14:20

BBB, Нет, как раз FindFirst/FindNext являются обвязкой для FindFirstFile/FindNextFile и в записи TSearchRec есть параметр FindData, который и получает оригинальную инфу от функций [b/FindFirstFile/FindNextFile[/b], и которую можно "попользовать" в целях узнавания длины. т.е.:
SR.FindData.nFileSizeHigh и
SR.FindData.nFileSizeLow
С уважением, Lost Angel...
namomelkor
Сообщения: 227
Зарегистрирован: 31 авг 2006, 13:11

12 мар 2007, 15:14

а как SR.FindData.nFileSizeHigh и SR.FindData.nFileSizeLow в одну переменную запихнуть?
Absurd
Сообщения: 1213
Зарегистрирован: 26 фев 2004, 13:24
Откуда: Pietari, Venäjä
Контактная информация:

12 мар 2007, 15:35

namomelkor писал(а):а как SR.FindData.nFileSizeHigh и SR.FindData.nFileSizeLow в одну переменную запихнуть?
Сдвинуть SR.FindData.nFileSizeHigh на 32 бита влево и наложить SR.FindData.nFileSizeLow через побитовое OR
2B OR NOT(2B) = FF
BBB
Сообщения: 1272
Зарегистрирован: 27 дек 2005, 13:37

12 мар 2007, 15:38

LAngel писал(а):BBB, Нет, как раз FindFirst/FindNext являются обвязкой для FindFirstFile/FindNextFile и в записи TSearchRec есть параметр FindData, который и получает оригинальную инфу от функций [b/FindFirstFile/FindNextFile[/b], и которую можно "попользовать" в целях узнавания длины
Это да. Я немного недопонял.

Absurd писал(а):Сдвинуть SR.FindData.nFileSizeHigh на 32 бита влево и наложить SR.FindData.nFileSizeLow через побитовое OR
В данном случае, можно обойтись обычным суммированием (после сдвига SR.FindData.nFileSizeHigh на 32 бита влево), а не побитовым OR :)
Аватара пользователя
LAngel
Сообщения: 277
Зарегистрирован: 30 мар 2005, 08:19
Откуда: Ульяновск
Контактная информация:

12 мар 2007, 15:41

namomelkor писал(а):а как SR.FindData.nFileSizeHigh и SR.FindData.nFileSizeLow в одну переменную запихнуть?

Код: Выделить всё

var
  Size: Int64;
begin
  ...
  Size := SR.FindData.nFileSizeHigh;
  Size := Size shl 32 or SR.FindData.nFileSizeLow;
С уважением, Lost Angel...
Ответить