Страница 1 из 2

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

Добавлено: 12 мар 2007, 11:20
namomelkor
sr: TSearchRec;
делаю
if FindFirst(partstr + '*.*', faAnyFile, sr) = 0 then

и тд.

sr.Size выходит за пределы integer и показывает минусовый размер
как это обойти.

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

Добавлено: 12 мар 2007, 11:54
Хыиуду
а разве size не имеет размерность Longint?

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

Добавлено: 12 мар 2007, 11:57
namomelkor
Хыиуду писал(а):а разве 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;

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

Добавлено: 12 мар 2007, 13:21
LAngel
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;

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

Добавлено: 12 мар 2007, 14:09
BBB
Хыиуду,
integer в Delphi - 32-разрядное число (см.Help по Delphi). Т.е., по сути, integer и longint - одно и то же.

LAngel,
видимо, ты путаешь Дельфийные (Паскалевские) функции FindFirst/FindNext и WinAPI-шные FindFirstFile/FindNextFile.
В первом случае там действительно, как и написал namomelkor параметр типа TSearchRec. А вот во втором случае все так, как написал ты (WIN32_FIND_DATA)

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

Добавлено: 12 мар 2007, 14:20
LAngel
BBB, Нет, как раз FindFirst/FindNext являются обвязкой для FindFirstFile/FindNextFile и в записи TSearchRec есть параметр FindData, который и получает оригинальную инфу от функций [b/FindFirstFile/FindNextFile[/b], и которую можно "попользовать" в целях узнавания длины. т.е.:
SR.FindData.nFileSizeHigh и
SR.FindData.nFileSizeLow

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

Добавлено: 12 мар 2007, 15:14
namomelkor
а как SR.FindData.nFileSizeHigh и SR.FindData.nFileSizeLow в одну переменную запихнуть?

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

Добавлено: 12 мар 2007, 15:35
Absurd
namomelkor писал(а):а как SR.FindData.nFileSizeHigh и SR.FindData.nFileSizeLow в одну переменную запихнуть?
Сдвинуть SR.FindData.nFileSizeHigh на 32 бита влево и наложить SR.FindData.nFileSizeLow через побитовое OR

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

Добавлено: 12 мар 2007, 15:38
BBB
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 :)

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

Добавлено: 12 мар 2007, 15:41
LAngel
namomelkor писал(а):а как SR.FindData.nFileSizeHigh и SR.FindData.nFileSizeLow в одну переменную запихнуть?

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

var
  Size: Int64;
begin
  ...
  Size := SR.FindData.nFileSizeHigh;
  Size := Size shl 32 or SR.FindData.nFileSizeLow;