Как юзать FindFirst , FindNext для файлов размер которых выходит за integer
Модераторы: Duncon, Naeel Maqsudov, Игорь Акопян, Хыиуду
-
- Сообщения: 230
- Зарегистрирован: 31 авг 2006, 13:11
sr: TSearchRec;
делаю
if FindFirst(partstr + '*.*', faAnyFile, sr) = 0 then
и тд.
sr.Size выходит за пределы integer и показывает минусовый размер
как это обойти.
делаю
if FindFirst(partstr + '*.*', faAnyFile, sr) = 0 then
и тд.
sr.Size выходит за пределы integer и показывает минусовый размер
как это обойти.
а разве size не имеет размерность Longint?
Искусство программирования - заставить компьютер делать все то, что вам делать лень.
Для "спасибо" есть кнопка "Спасибо" в виде звездочки внизу под ником автора поста.
Для "спасибо" есть кнопка "Спасибо" в виде звездочки внизу под ником автора поста.
-
- Сообщения: 230
- Зарегистрирован: 31 авг 2006, 13:11
TSearchRec = recordХыиуду писал(а):а разве size не имеет размерность Longint?
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;
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...
Хыиуду,
integer в Delphi - 32-разрядное число (см.Help по Delphi). Т.е., по сути, integer и longint - одно и то же.
LAngel,
видимо, ты путаешь Дельфийные (Паскалевские) функции FindFirst/FindNext и WinAPI-шные FindFirstFile/FindNextFile.
В первом случае там действительно, как и написал namomelkor параметр типа TSearchRec. А вот во втором случае все так, как написал ты (WIN32_FIND_DATA)
integer в Delphi - 32-разрядное число (см.Help по Delphi). Т.е., по сути, integer и longint - одно и то же.
LAngel,
видимо, ты путаешь Дельфийные (Паскалевские) функции FindFirst/FindNext и WinAPI-шные FindFirstFile/FindNextFile.
В первом случае там действительно, как и написал namomelkor параметр типа TSearchRec. А вот во втором случае все так, как написал ты (WIN32_FIND_DATA)
BBB, Нет, как раз FindFirst/FindNext являются обвязкой для FindFirstFile/FindNextFile и в записи TSearchRec есть параметр FindData, который и получает оригинальную инфу от функций [b/FindFirstFile/FindNextFile[/b], и которую можно "попользовать" в целях узнавания длины. т.е.:
SR.FindData.nFileSizeHigh и
SR.FindData.nFileSizeLow
SR.FindData.nFileSizeHigh и
SR.FindData.nFileSizeLow
С уважением, Lost Angel...
-
- Сообщения: 230
- Зарегистрирован: 31 авг 2006, 13:11
а как SR.FindData.nFileSizeHigh и SR.FindData.nFileSizeLow в одну переменную запихнуть?
-
- Сообщения: 1228
- Зарегистрирован: 26 фев 2004, 13:24
- Откуда: Pietari, Venäjä
- Контактная информация:
Сдвинуть SR.FindData.nFileSizeHigh на 32 бита влево и наложить SR.FindData.nFileSizeLow через побитовое ORnamomelkor писал(а):а как SR.FindData.nFileSizeHigh и SR.FindData.nFileSizeLow в одну переменную запихнуть?
2B OR NOT(2B) = FF
Это да. Я немного недопонял.LAngel писал(а):BBB, Нет, как раз FindFirst/FindNext являются обвязкой для FindFirstFile/FindNextFile и в записи TSearchRec есть параметр FindData, который и получает оригинальную инфу от функций [b/FindFirstFile/FindNextFile[/b], и которую можно "попользовать" в целях узнавания длины
В данном случае, можно обойтись обычным суммированием (после сдвига SR.FindData.nFileSizeHigh на 32 бита влево), а не побитовым ORAbsurd писал(а):Сдвинуть SR.FindData.nFileSizeHigh на 32 бита влево и наложить SR.FindData.nFileSizeLow через побитовое OR

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...