Вопрос, поднятый пользователем, заключается в необходимости создать собственный класс потока в Delphi для работы с большими объемами данных, поступающих из DLL, которые содержат нежелательные префиксы и постфиксы. Решение заключается в создании класса TFileStream2, который позволит обрезать данные как в начале, так и в конце файла.
Описание задачи
Имеется DLL, которая выводит данные в поток. Однако к данным добавляются нежелательные префиксы и постфиксы. Пользователь хочет избежать использования MemoryStream для обработки нескольких гигабайт данных, так как предпочитает сохранять данные напрямую в файл (FileStream). Поэтому было принято решение создать собственный класс потока.
Решение
Создан функция TFileStream2.Write, которая позволяет обрезать начальные байты, проверяя свойство Position. Однако требуется также обнаружить конец потока для обрезки байтов в конце.
Подтвержденное решение
После уничтожения объекта потока можно обрезать конечную часть файла, модифицируя свойство Size. Это позволит корректно уменьшить размер файла, даже если байты уже записаны на диск.
Комментарии
Необходимо отметить, что изменение свойства Size файла позволит его сократить. Однако важно понимать, что физически байты на диске не удаляются, а просто изменяется информация о размере файла в файловой системе.
Пример кода
type
TFileStream2 = class(TFileStream)
private
FPrefixLen, FSuffixLen: Integer;
function GetSize(SizeType: TStreamSize): Int64; override;
public
constructor Create(AFileName: string; var Options: Integer);
property PrefixLen: Integer read FPrefixLen write FPrefixLen;
property SuffixLen: Integer read FSuffixLen write FSuffixLen;
function Write(const Buffer; Count: Integer): Longint; override;
end;
{ TFileStream2 }
constructor TFileStream2.Create(AFileName: string; var Options: Integer);
begin
inherited Create(AFileName, Options or fmOpenWrite or fmCreate);
FPrefixLen := 0;
FSuffixLen := 0;
end;
function TFileStream2.GetSize(SizeType: TStreamSize): Int64;
begin
if SizeType = stSizePhysical then
Result := inherited GetSize(SizeType) - FPrefixLen - FSuffixLen;
else
Result := inherited GetSize(SizeType);
end;
function TFileStream2.Write(const Buffer; Count: Integer): Longint;
var
PrefixBytes, SuffixBytes: Integer;
begin
// Обрезка начальных байтов
if Position = 0 then
begin
PrefixBytes := MinValue(Count, FPrefixLen);
SetLength(Buffer, Count - PrefixBytes);
Count := Count - PrefixBytes;
FPrefixLen := FPrefixLen - PrefixBytes;
end;
// Осуществляем запись
Result := inherited Write(Buffer, Count);
// Проверка на конец потока
if Count > 0 then
begin
SuffixBytes := SuffixBytes;
// Предполагается, что конец потока определяется каким-то условием
if YourConditionToCheckEndOfStream then
begin
FSuffixLen := MinValue(SuffixBytes, Count);
end;
if FSuffixLen > 0 then
begin
Count := Count - FSuffixLen;
// Необходимо реализовать обратную запись начальных FSuffixLen байт
end;
end;
end;
Важно
Для реализации полного решения необходимо определить логику, которая будет определять конец потока и соответствующий размер постфикса (FSuffixLen).
Вывод
Создание собственного класса потока в Delphi позволяет решать задачи по работе с большими объемами данных, выводящимися из DLL, с возможностью обрезки начальных и конечных данных. Приведенный пример кода демонстрирует основу для такого класса, который может быть дополнен и адаптирован в зависимости от конкретных требований задачи.
Задача состоит в создании в Delphi собственного класса потока для обрезки префиксов и постфиксов в больших объемах данных, поступающих из DLL, без использования `MemoryStream` и с возможностью прямой записи в файл.
Комментарии и вопросы
Получайте свежие новости и обновления по Object Pascal, Delphi и Lazarus прямо в свой смартфон. Подпишитесь на наш Telegram-канал delphi_kansoftware и будьте в курсе последних тенденций в разработке под Linux, Windows, Android и iOS
Материалы статей собраны из открытых источников, владелец сайта не претендует на авторство. Там где авторство установить не удалось, материал подаётся без имени автора. В случае если Вы считаете, что Ваши права нарушены, пожалуйста, свяжитесь с владельцем сайта.