Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > Delphi программирование > Общие вопросы Delphi
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 03.12.2015, 12:38   #1
BLACK_RAIN
Форумчанин
 
Регистрация: 13.02.2012
Сообщений: 867
По умолчанию Прочитать/записать указанный байт из большого файла

Здравствуйте.
Нужно открыть большой файл, не загружая его целеком в память, и прочитать из него указанные байты. И заменить их.
Был уверен, что компонент TFileStream для этого подойдет. Но, как оказалось, он может читать и писать файлы только до позиции в 31 бит, то есть 2147483647. Если не ошибаюсь, используются 32-битные WinAPI'шные функции. Отсюда и ограничение.
Подскажите способ обойти это ограничение (кроме перехода на 64-битную delphi). Знаю, что есть какой-то способ. Ведь есть 32-битные проги, которым это ограничение не помеха.

Последний раз редактировалось BLACK_RAIN; 03.12.2015 в 12:45.
BLACK_RAIN вне форума Ответить с цитированием
Старый 03.12.2015, 13:10   #2
Filka
Форумчанин
 
Регистрация: 29.10.2015
Сообщений: 273
По умолчанию

http://gp.17slon.com/gp/gphugefile.htm
Filka вне форума Ответить с цитированием
Старый 03.12.2015, 13:14   #3
Stilet
Белик Виталий :)
Старожил
 
Аватар для Stilet
 
Регистрация: 23.07.2007
Сообщений: 57,097
По умолчанию

Цитата:
он может читать и писать файлы только до позиции в 31 бит
Это ты как выяснил? Цитирую хелп:
Цитата:
property Position: Int64;
Так что оч. сомневаюсь в твоей правоте. Без обид.
I'm learning to live...
Stilet вне форума Ответить с цитированием
Старый 03.12.2015, 15:18   #4
Пепел Феникса
Старожил
 
Аватар для Пепел Феникса
 
Регистрация: 28.01.2009
Сообщений: 21,000
По умолчанию

на край пишите сами с использованием WinAPI.
32-битность винды тут не причем.
Цитата:
Это ты как выяснил? Цитирую хелп:
лучше процитируй мне исходники класса
Хорошо поставленный вопрос это уже половина ответа. | Каков вопрос, таков ответ.
Программа делает то что написал программист, а не то что он хотел.
Функции/утилиты ждут в параметрах то что им надо, а не то что вы хотите.
Пепел Феникса вне форума Ответить с цитированием
Старый 03.12.2015, 15:28   #5
Stilet
Белик Виталий :)
Старожил
 
Аватар для Stilet
 
Регистрация: 23.07.2007
Сообщений: 57,097
По умолчанию

Цитата:
лучше процитируй мне исходники класса
Код:
  function TStream.GetPosition: Int64;

    begin
       Result:=Seek(0,soCurrent);
    end;
Или ты имеешь ввиду это:
Код:
      if (Offset<Low(longint)) or
         (Offset>High(longint)) then
в самой Seek() ?
I'm learning to live...
Stilet вне форума Ответить с цитированием
Старый 03.12.2015, 15:45   #6
FaTaL
Участник клуба
 
Аватар для FaTaL
 
Регистрация: 09.11.2007
Сообщений: 1,761
По умолчанию

Цитата:
кроме перехода на 64-битную delphi
Разве такая есть?
Да вроде TFileStream всегда справлялся с большими файлами. По крайней мере я не замечал ограничений.
FaTaL вне форума Ответить с цитированием
Старый 03.12.2015, 16:04   #7
BLACK_RAIN
Форумчанин
 
Регистрация: 13.02.2012
Сообщений: 867
По умолчанию

Цитата:
Сообщение от Stilet Посмотреть сообщение
Это ты как выяснил? Цитирую хелп: property Position: Int64

Так что оч. сомневаюсь в твоей правоте. Без обид.
нажми ctrl и кликни мышкой по слову seek
Код:
function THandleStream.Seek(const Offset: Int64; Origin: TSeekOrigin): Int64;
begin
  Result := FileSeek(FHandle, Offset, Ord(Origin));
end;
теперь скажи, как ты свой Int64 в Integer засунешь? тоже без обид
Цитата:
Сообщение от Filka Посмотреть сообщение
Спасибо. Пока не тестировал,но скрестив пальцы, файл ~16gb вроде перематывается без ошибок. На других файлах пока не проверял.
Однако, следует отметить, что метод seek() по прежнему ограничен 31-битным числом. Перемотка осуществляется с помощью свойства Position.
Если кто юзал компонент TGpHugeFileStream, поделитесь опытом, как он вообще? Файлы какого размера открывает? Работает ли функция записи в большой файл? не косячит файлы от этого?

Цитата:
Сообщение от FaTaL Посмотреть сообщение
Разве такая есть?
Да вроде TFileStream всегда справлялся с большими файлами. По крайней мере я не замечал ограничений.
Delphi XE c какой-то версии стала х64. Там выбрать можно х32 или х64 билд проекта (конечно, если винда х64).
Разве справлялся? Это же обёртка над FileOpen , FileSeek и т.д.

Последний раз редактировалось Stilet; 03.12.2015 в 16:13.
BLACK_RAIN вне форума Ответить с цитированием
Старый 03.12.2015, 16:13   #8
Stilet
Белик Виталий :)
Старожил
 
Аватар для Stilet
 
Регистрация: 23.07.2007
Сообщений: 57,097
По умолчанию

Цитата:
нажми ctrl и кликни мышкой по слову seek
Ты не внимательный )
См. выше )
I'm learning to live...
Stilet вне форума Ответить с цитированием
Старый 03.12.2015, 16:20   #9
Pavia
Лис
Старожил
 
Аватар для Pavia
 
Регистрация: 18.09.2015
Сообщений: 2,409
По умолчанию

http://docs.embarcadero.com/products...4@Integer.html

В Delphi7: FileSeek в одном варианте исполнения Cardinal 32 бита
Начиная с Delphi 2009 в двух вариантах 32 и 64 битное.

Цитата:
Там выбрать можно х32 или х64 билл.
От билда это не зависит выбор делается на основе входных параметров, вернее их типов.

Поэтому в Delphi7 имеется неудобство для работы с файлами более 2 ГБ. Но их легко обойти добавив нужные функции и методы в класс. Собственно их всего две Seek и Position.

По поводу удивления того что в Delphi 7 всё работало и так. Можно и не добавлять. При циклическом чтение, когда смещение идёт относительно, а не абсолютное ОС отрабатывает нормально. И файлы больше 2ГБ будут нормально читаться и писаться.
Хорошо поставленный вопрос это уже половина ответа. | Каков вопрос, таков ответ.
У дзен программиста программа делает то что он хотел, а не то что он написал .

Последний раз редактировалось Pavia; 03.12.2015 в 16:26.
Pavia вне форума Ответить с цитированием
Старый 03.12.2015, 16:23   #10
BLACK_RAIN
Форумчанин
 
Регистрация: 13.02.2012
Сообщений: 867
По умолчанию

stilet
а с фига я-то не внимательный?
метод seek вызывает винапишный FileSeek, который 32-битный. Что еще тут можно добавить. Int64 в Integer ведь не засунешь.
pavia
Цикличиское чтение не удобно. Мне надо читать и писать рандомные участки файла.

Последний раз редактировалось BLACK_RAIN; 03.12.2015 в 16:27.
BLACK_RAIN вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
как прочитать 7 первых байт файла ? Konstantin_ua Общие вопросы Delphi 2 21.01.2014 17:40
Прочитать из первого файла и записать во второй символ (QBasic) ulika Помощь студентам 1 28.12.2013 11:49
Прочитать из файла числа, отсортировать их по возрастанию, результат записать в новый файл. lika1129970 Паскаль, Turbo Pascal, PascalABC.NET 7 02.04.2013 13:45
Прочитать из файла и записать в функцию Ilya_L Общие вопросы Delphi 3 27.10.2010 15:48
как прочитать из файла имя, фамилию разделенные пробелами и записать их в массив парами Rom@shka Общие вопросы C/C++ 2 13.12.2008 16:40