Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > Delphi: Общие вопросы > FireMonkey - macos - SetEndOfFile


Автор: ekzo 26.7.2014, 04:56
Есть такая функция, не пойму чем на FireMonkey заменить SetEndOfFile

Код

procedure SetStreamEnd(aStream: TStream);
begin
  if aStream is THandleStream then SetEndOfFile((aStream as THandleStream).Handle)
  else if aStream is TMemoryStream then TMemoryStream(aStream).SetSize(aStream.Position);
end;

Автор: CynicRus 28.7.2014, 10:10
В Posix есть функция ftruncate.

Полагаю, что в код будет выглядеть типа:
Код

 if aStream is THandleStream then  ftruncate((aStream as THandleStream).Handle, 0) 

Автор: ekzo 29.7.2014, 05:36
Была такая мысль. Спасибо, попробую.

Автор: bems 29.7.2014, 12:52
а что, присваивание Size не работает?

Автор: ekzo 30.7.2014, 05:47
Цитата(CynicRus @ 28.7.2014,  10:10)
В Posix есть функция ftruncate.

Полагаю, что в код будет выглядеть типа:
Код

 if aStream is THandleStream then  ftruncate((aStream as THandleStream).Handle, 0) 

В итоге файл получается нулевого размера...

Добавлено через 1 минуту и 14 секунд
Цитата(bems @ 29.7.2014,  12:52)
а что, присваивание Size не работает?

Будьте добры поподробней smile

Автор: bems 30.7.2014, 09:17
Цитата(ekzo @  30.7.2014,  05:47 Найти цитируемый пост)
Будьте добры поподробней

я имею в виду присваивание aStream.Size := aStream.Position

это фактически тоже самое что у тебя для случая TMemoryStream. но не понятно зачем ты особо предусматриваешь случай TMemoryStream а особо THandleStream, еще и скатываешься в апи-вызовы для последнего случая. в ХЕ4 например THandleStream.SetSize реализована так:
Код

procedure THandleStream.SetSize(const NewSize: Int64);
begin
  Seek(NewSize, soBeginning);
{$IF Defined(MSWINDOWS)}
  Win32Check(SetEndOfFile(FHandle));
{$ELSEIF Defined(POSIX)}
  if ftruncate(FHandle, Position) = -1 then
    raise EStreamError(sStreamSetSize);
{$ENDIF POSIX}
end;

то есть ты можешь всегда делать SetSize(Positioin) или Size := Positioin

или я не уловил какую-то тонкость?

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)