Страница 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;