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

Ответить

Код подтверждения
Введите код в точности так, как вы его видите. Регистр символов не имеет значения.

BBCode ВКЛЮЧЁН
[img] ВКЛЮЧЁН
[url] ВКЛЮЧЁН
Смайлики ОТКЛЮЧЕНЫ

Обзор темы
   

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

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

LAngel » 12 мар 2007, 16:00

somewhere писал(а):Dword * Dword * ... = DWord, естественно, что 0, ведь это больше 4G.
Ведь уже написали, как вычислять.
Через суммирование - SZ := High shl 32 + Low
High shl 32 = 0 :) ) ибо High - это DWORD.
надо Int64(High) shl + Low;

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

somewhere » 12 мар 2007, 15:55

&quot писал(а):sr.FindData.nFileSizeHigh*256*256*256*256
Dword * Dword * ... = DWord, естественно, что 0, ведь это больше 4G.
Ведь уже написали, как вычислять.
Через суммирование - SZ := High shl 32 + Low

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

namomelkor » 12 мар 2007, 15:43

не помню как сдвигать и не понял как обойтись сомированием )
короче сделал так
temp:=sr.FindData.nFileSizeHigh*256;
temp:=temp*256;
temp:=temp*256;
temp:=temp*256;
sz:=temp+sr.FindData.nFileSizeLow;

и еще делфи почемуто не вычистяет выражение sr.FindData.nFileSizeHigh*256*256*256*256 пишет 0.

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

LAngel » 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;

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

BBB » 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 :)

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

Absurd » 12 мар 2007, 15:35

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

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

namomelkor » 12 мар 2007, 15:14

а как SR.FindData.nFileSizeHigh и SR.FindData.nFileSizeLow в одну переменную запихнуть?

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

LAngel » 12 мар 2007, 14:20

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

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

BBB » 12 мар 2007, 14:09

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

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

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

LAngel » 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;

Вернуться к началу