Отлично. Наконец то хоть какое-то движение в этом разделе. А то уж думал всем наплевать. Пока тестируй, а я постараюсь этот экспорт в ближайший следующий релиз добавить.zed писал(а):Сегодня уже некогда погонять, но на первый взгляд должно работать. Завтра если будет время напишу тестовую утиль и погоняю под нагрузкой.
Тип плагинов: Простой экспорт в файл
- vdemidov
- Гуру
- Сообщения: 1687
- Зарегистрирован: 12 дек 2008, 13:10
- Откуда: Киев
- Благодарил (а): 191 раз
- Поблагодарили: 157 раз
Re: Тип плагинов: Простой экспорт в файл
Чтобы понять программу, вы должны стать одновременно и машиной, и программой.
- DJ VK
- Гуру
- Сообщения: 1468
- Зарегистрирован: 16 апр 2009, 13:57
- Откуда: 8 км. от МКАД
- Благодарил (а): 80 раз
- Поблагодарили: 314 раз
Re: Тип плагинов: Простой экспорт в файл
Еще один архиватор 7-zip. Delphi SDK - http://www.birtles.org.uk/programming/LZMA.442b.7z
Процесс архивации примерно такой (без учета подготовки и записи потоков)
Осталось понять как пихать не 1 входной файл (ну или буфер), а несколько
Процесс архивации примерно такой (без учета подготовки и записи потоков)
Код: Выделить всё
dictionary:integer;
inStream:TBufferedFS;
outStream:TBufferedFS;
eos:boolean;
encoder:TLZMAEncoder;
filesize:int64;
i:integer;
properties:array[0..4] of byte;
decoder:TLZMADecoder;
outSize:int64;
v:byte;
const propertiessize=5;
set compression mode - [0, 1], default: 1 (max)\n' +
set dictionary - [0,28], default: 23 (8MB)'#10 +
set number of fast bytes - [5, 273], default: 128'#10 +
set number of literal context bits - [0, 8], default: 3'#10 +
set number of literal pos bits - [0, 4], default: 0'#10 +
set number of pos bits - [0, 4], default: 2'#10 +
set Match Finder: [bt2, bt4], default: bt4'#10 +
write End Of Stream marker'#10
inStream:=TBufferedFS.Create(params.InFile,fmOpenRead or fmsharedenynone);
outStream:=TBufferedFS.Create(params.OutFile,fmcreate);
eos := params.Eos;
encoder:=TLZMAEncoder.Create;
if not encoder.SetAlgorithm(params.Algorithm) then raise Exception.Create('Incorrect compression mode');
if not encoder.SetDictionarySize(params.DictionarySize) then raise Exception.Create('Incorrect dictionary size');
if not encoder.SeNumFastBytes(params.Fb) then raise Exception.Create('Incorrect -fb value');
if not encoder.SetMatchFinder(params.MatchFinder) then raise Exception.Create('Incorrect -mf value');
if not encoder.SetLcLpPb(params.Lc, params.Lp, params.Pb) then raise Exception.Create('Incorrect -lc or -lp or -pb value');
encoder.SetEndMarkerMode(eos);
encoder.WriteCoderProperties(outStream);
if eos then fileSize := -1 else fileSize := inStream.Size;
for i := 0 to 7 do
WriteByte(outStream,(fileSize shr (8 * i)) and $FF);
encoder.Code(inStream, outStream, -1, -1);
encoder.free;
end
Re: Тип плагинов: Простой экспорт в файл
Zed, огромное спасибо за выложенные сорцы плагина.zed писал(а):Сегодня уже некогда погонять, но на первый взгляд должно работать. Завтра если будет время напишу тестовую утиль и погоняю под нагрузкой.
Увы в Дельфях я полный чайник (както за 20 лет программерского стажа руки не доходили до дельфей )
но по образу и подобию с вашими сорцами все стало более менее понятно. Попробую написать свой плагинчик.
Буду крайне признателен если выложите еще сорцы тестовой утилиты что-бы было чем плагинчик потестить.
-
zed
- Гуру
- Сообщения: 2888
- Зарегистрирован: 16 авг 2008, 20:21
- Благодарил (а): 89 раз
- Поблагодарили: 568 раз
Re: Тип плагинов: Простой экспорт в файл
Так-с, протестировал - всё работает как задумано (с upd исходниками).
При экспорте в tar данным плагином, следует учитывать, что а) архив создаётся с перезаписью; б) если вдруг SAS скормит два тайла с одинаковыми именами, то в архиве окажется два одинаковых файла (будут только временем создания отличаться). Конечно, при распаковке один тайл перезапишет другой и в итоге останется как и положено всего один, но вот такая особенность присутствует.
При экспорте в tar данным плагином, следует учитывать, что а) архив создаётся с перезаписью; б) если вдруг SAS скормит два тайла с одинаковыми именами, то в архиве окажется два одинаковых файла (будут только временем создания отличаться). Конечно, при распаковке один тайл перезапишет другой и в итоге останется как и положено всего один, но вот такая особенность присутствует.
- vdemidov
- Гуру
- Сообщения: 1687
- Зарегистрирован: 12 дек 2008, 13:10
- Откуда: Киев
- Благодарил (а): 191 раз
- Поблагодарили: 157 раз
Re: Тип плагинов: Простой экспорт в файл
Логично. Хотя можно подумать, о том что бы добавить возможность сообщить хост-программе, что он умеет или не умеет добавлять данные в существующий файл.zed писал(а):а) архив создаётся с перезаписью
Ну это понятно.zed писал(а):б) если вдруг SAS скормит два тайла с одинаковыми именами, то в архиве окажется два одинаковых файла (будут только временем создания отличаться). Конечно, при распаковке один тайл перезапишет другой и в итоге останется как и положено всего один, но вот такая особенность присутствует.
Чтобы понять программу, вы должны стать одновременно и машиной, и программой.
-
zed
- Гуру
- Сообщения: 2888
- Зарегистрирован: 16 авг 2008, 20:21
- Благодарил (а): 89 раз
- Поблагодарили: 568 раз
Re: Тип плагинов: Простой экспорт в файл
На будущее, есть предложения по интерфейсам:
1. Перенести переменную ALonLatRect: TDoubleRect из ProcessTile в StartExport. Если я правильно понял то здесь у нас координаты выделенного квадрата который мы экспортируем. Поскольку в процессе экспорта эта переменная меняться не будет, то и передавать её с каждым тайлом нет смысла. Достаточно передать её один раз при инициализации.
2. В ProcessTile добавить переменную ATileDate (TDateTime?) с датой создания тайла. На данный момент дата тайла устанавливается дате добавления его в архив.
3. В ISimpleTileProcessor добавить функцию CheckActiveState:Boolean (см. следующий пункт).
4. Процедуру ProcessTile превратить в функцию. Результатом её должен быть размер экспортированного тайла, либо ноль (при ошибке экспорта). А SAS должна проверять размер тайла с ответом этой функции, и если они не совпадают, то вызывать функцию CheckActiveState. Если результат функции будет False, то экспорт должен завершиться. Это позволит плагину прерывать экспорт при ошибках или из других своих соображений.
И из пожеланий, хотелось бы всё же иметь информацию о имени экспортируемой папки в кэше.
1. Перенести переменную ALonLatRect: TDoubleRect из ProcessTile в StartExport. Если я правильно понял то здесь у нас координаты выделенного квадрата который мы экспортируем. Поскольку в процессе экспорта эта переменная меняться не будет, то и передавать её с каждым тайлом нет смысла. Достаточно передать её один раз при инициализации.
2. В ProcessTile добавить переменную ATileDate (TDateTime?) с датой создания тайла. На данный момент дата тайла устанавливается дате добавления его в архив.
3. В ISimpleTileProcessor добавить функцию CheckActiveState:Boolean (см. следующий пункт).
4. Процедуру ProcessTile превратить в функцию. Результатом её должен быть размер экспортированного тайла, либо ноль (при ошибке экспорта). А SAS должна проверять размер тайла с ответом этой функции, и если они не совпадают, то вызывать функцию CheckActiveState. Если результат функции будет False, то экспорт должен завершиться. Это позволит плагину прерывать экспорт при ошибках или из других своих соображений.
И из пожеланий, хотелось бы всё же иметь информацию о имени экспортируемой папки в кэше.
- vdemidov
- Гуру
- Сообщения: 1687
- Зарегистрирован: 12 дек 2008, 13:10
- Откуда: Киев
- Благодарил (а): 191 раз
- Поблагодарили: 157 раз
Re: Тип плагинов: Простой экспорт в файл
Нет. Это именно координаты тайла. И для всех тайлов они будут разные. А область экспорта вполне возможно и даже скорее всего будет не прямоугольной и может быть даже не сплошной. Так что место для параметра абсолютно правильное.zed писал(а):1. Перенести переменную ALonLatRect: TDoubleRect из ProcessTile в StartExport. Если я правильно понял то здесь у нас координаты выделенного квадрата который мы экспортируем. Поскольку в процессе экспорта эта переменная меняться не будет, то и передавать её с каждым тайлом нет смысла. Достаточно передать её один раз при инициализации.
Да это можно. Не подумал.zed писал(а):2. В ProcessTile добавить переменную ATileDate (TDateTime?) с датой создания тайла. На данный момент дата тайла устанавливается дате добавления его в архив.
Зачем так сложно? Не проще ли будет просто сразу возвращать логическое значение? А вообще я планирую заюзать Safecall и IErrorInfo.zed писал(а):3. В ISimpleTileProcessor добавить функцию CheckActiveState:Boolean (см. следующий пункт).
4. Процедуру ProcessTile превратить в функцию. Результатом её должен быть размер экспортированного тайла, либо ноль (при ошибке экспорта). А SAS должна проверять размер тайла с ответом этой функции, и если они не совпадают, то вызывать функцию CheckActiveState. Если результат функции будет False, то экспорт должен завершиться. Это позволит плагину прерывать экспорт при ошибках или из других своих соображений.
Не. Этого точно не будет. Не пытайтесь сразу все упихать в один тип плагинов. По мере реализации разных экспортов будет видно чего не хватает, тогда и будем придумывать новые интерфесы. Просто сложный интерфейс сложно и использовать. А я к этому не готов. Пока только самое простое.zed писал(а):И из пожеланий, хотелось бы всё же иметь информацию о имени экспортируемой папки в кэше.
Чтобы понять программу, вы должны стать одновременно и машиной, и программой.