Форум: "Основная";
Текущий архив: 2014.06.08;
Скачать: [xml.tar.bz2];
ВнизZLIB (с мусором в конце) в XE/XE2 - косячит? Найти похожие ветки
← →
klimov (2011-12-27 08:11) [0]Пытаюсь распаковать файл методом ZLIB.
НО: неужели зависит от места расположения архива?????
Т.е. набросал прогу которая распаковывает один и тот же архив, но по первой кнопке берет с корня диска C, вторая кнопка с текущей папки программы.
Результат распаковки разный.
Может уважаемый ГУРУ подскажет где я ошибся?
Весь проект прикладываю (Исполнимый файл присутствует)
PS: распаковать в корень диска C:/
Компиляцию выполнена на Delphi XE2 (проверено и на Delphi XE)
← →
klimov (2011-12-27 08:14) [1]вот ссылка на проект: http://rghost.ru/35622004
← →
sniknik © (2011-12-27 11:16) [2]> где я ошибся?
в юникоде? библиотека zlib-а не завязана на строки?
> НО: неужели зависит от места расположения архива?????
от памяти которая выделена записалась но не использовалась. т.е. выделили случайную и записали.
сделай 2 подряд из одного и того же места в разные файлы, что получилось?
← →
Ega23 © (2011-12-27 12:09) [3]
procedure ZCompressStream(Stream: TMemoryStream; Level: TCompressionLevel = clDefault);
var
pOut: Pointer;
outSize: Integer;
begin
ZCompress(Stream.Memory, Stream.Size, pOut, outSize, cZCompLevel[Level]);
Stream.Clear;
Stream.WriteBuffer(pOut^, outSize);
Stream.Position := 0;
FreeMem(pOut);
end;
//*****************************************************************************
procedure ZDecompressStream(Stream: TMemoryStream);
var
pOut: Pointer;
outSize: Integer;
begin
ZDecompress(Stream.Memory, Stream.Size, pOut, outSize);
Stream.Clear;
Stream.WriteBuffer(pOut^, outSize);
Stream.Position := 0;
FreeMem(pOut);
end;
← →
klimov (2011-12-28 07:34) [4]Если файл в текущей дирректории (кнопка "00015068" - Button3Click) все отлично, и размер распакованного файла верный.
Если файл на диске C:\ (кнопка "C:\00015068" - Button2Click) получаем исключение:
Project Project.exe raised exception class EZDecompressionError with message ‘buffer error’
← →
klimov (2011-12-28 07:40) [5]
> > НО: неужели зависит от места расположения архива?????
> от памяти которая выделена записалась но не использовалась.
> т.е. выделили случайную и записали.
> сделай 2 подряд из одного и того же места в разные файлы,
> что получилось?
Если взять файлы с разных мест, а писать в одно место, т.е. исправить:
в procedure TForm1.Button2Click(Sender: TObject);
...
outStream.SaveToFile("00015068_C");
...
то независимо в какой последовательности нажать кнопки. С текущей директории распаковывает верно, а с диска С:\ неверно!
← →
klimov (2011-12-28 07:46) [6]Ega32
> procedure ZDecompressStream(Stream: TMemoryStream);
тут описано почему такая ошибка возникает:
http://webcache.googleusercontent.com/search?q=cache:oviw8p_tzOYJ:https://forums.embarcadero.com/thread.jspa%3FthreadID%3D26424+raised+exception+class+EZDecompressionError+with+message+%E2%80%98buffer+error%E2%80%99&cd=1&hl=ru&ct=clnk&gl=ru
You then call zdecompress() with that buffer full of garbage, an outbuffer that you never allocated memory for (so it"s a nil pointer at best, and at worst a random memory location), and an outcount size that you never initialized (meaning it"s again a random number). No wonder zlib got confused.
← →
klimov (2011-12-28 07:51) [7]
> > НО: неужели зависит от места расположения архива?????
> от памяти которая выделена записалась но не использовалась.
> т.е. выделили случайную и записали.
> сделай 2 подряд из одного и того же места в разные файлы,
> что получилось?
Если брать файл в обоих случаях с диска С:\ - распаковывается НЕВЕРНО независимо куда.
Если брать файл в обоих случаях с текущей директории - распаковывается ВЕРНО независимо куда.
← →
sniknik © (2011-12-28 09:33) [8]скачал архив...
там 2 файла 00015068.ZLIB, один в корне другой в проекте... так вот если с C: положить файл из проекта то результаты одинаковы с текущим путем - т.е. ВЕРНЫЕ.
если из другой, из корня, то разные - т.е. НЕВЕРНЫЕ.
если из корня подложить в каталог проекта, то они опять становятся одинаковые...
указывай ПОЛНЫЙ путь всегда, не надейся на текущую директорию, и будет тебе "щастье". ИМХО.
← →
klimov (2011-12-28 09:46) [9]
> скачал архив...
> там 2 файла 00015068.ZLIB, один в корне другой в проекте.
> .. так вот если с C: положить файл из проекта то результаты
> одинаковы с текущим путем - т.е. ВЕРНЫЕ.
> если из другой, из корня, то разные - т.е. НЕВЕРНЫЕ.
> если из корня подложить в каталог проекта, то они опять
> становятся одинаковые...
> указывай ПОЛНЫЙ путь всегда, не надейся на текущую директорию,
> и будет тебе "щастье". ИМХО.
А ты не пробовал сравнить что на C: и в проекте? файлы абсолютно одинаковые.
В том то и вопрос, почему результаты то разные?
Если указать полный путь к файлу - НЕВЕРНЫЙ результат будет.
← →
sniknik © (2011-12-28 09:53) [10]> В том то и вопрос, почему результаты то разные?
с чего это? я же написал одинаковые, если один исходный файл с разных мест то АБСОЛЮТНО (svn подтверждает, до байта) . но у тебя их там 2, исходных, и вот они РАЗНЫЕ.
← →
klimov (2011-12-28 09:56) [11]
> с чего это? я же написал одинаковые, если один исходный
> файл с разных мест то АБСОЛЮТНО (svn подтверждает, до байта)
> . но у тебя их там 2, исходных, и вот они РАЗНЫЕ.
Можешь код показать, что ты хочешь сказать?
← →
klimov (2011-12-28 09:59) [12]Напиши длину в байтах распакованного файла на диске C:\ и в текущей папке.
← →
sniknik © (2011-12-28 10:16) [13]> Можешь код показать,
> скачал архив...
скачай его тоже... сам.
> что ты хочешь сказать?
хочу сказать что ты сам путаешься, разархивируешь разные архивы.
> Напиши длину в байтах распакованного файла на диске C:\
974 308 байт
> и в текущей папке.
974 308 байт
для исходного архива из каталога проекта ("текущей папке" по твоему определению), его класть на C:.
и
1 008 838 байт
также в обоих случаях для исходного архива из корня архива. им заменить в каталоге проекта, и на диск C:.
← →
klimov (2011-12-28 13:22) [14]
> 974 308 байтдля исходного архива из каталога проекта ("текущей
> папке" по твоему определению), его класть на C:.и1 008 838
> байттакже в обоих случаях для исходного архива из корня
> архива. им заменить в каталоге проекта, и на диск C:.
А вот теперь подумай сам как можно распаковать один и тот же архив и получить разные результаты?
Сравни файлы архива в корне С:\ и в "текущей директории"
← →
klimov (2011-12-28 13:25) [15]Если ты утверждаешь, что сами файлы архивов на диске С и в "текущей папке" разные, то сообщи пожалуйста различия их.
← →
sniknik © (2011-12-28 13:50) [16]> Если ты утверждаешь
доказывать ничего не собираюсь, не хочешь не верь (при возможности проверить самому... идиотизм)
> то сообщи пожалуйста различия их.
17я строка... (почти не шутка)
не можешь сам сравнить? тогда все бесполезно, бросай это программирование. зачем оно тебе?
← →
sniknik © (2011-12-28 13:56) [17]простейший способ проверки, заархивируй оба rar-ом (есть точно), дефаултным сжатием, и посмотри размер - 366 057 байт у одного и 366 078 байт у другого.
или он тоже глючит?
← →
klimov (2011-12-28 14:06) [18]Действительно, файлы-источники в архиве разные, извини, просто был уверен что распаковываю одно и то же.
← →
Медвежонок Пятачок © (2011-12-28 14:07) [19]Если брать файл в обоих случаях с диска С:\ - распаковывается НЕВЕРНО независимо куда.
Если брать файл в обоих случаях с текущей директории - распаковывается ВЕРНО независимо куда.
Это же классика жанра.
забытый ofNoChangeDir у опендиалога и приколы текущего каталога процесса связанные с этим.
← →
Ega23 © (2011-12-29 12:18) [20]
> klimov (28.12.11 07:46) [6]
>
> Ega32
> > procedure ZDecompressStream(Stream: TMemoryStream);
>
>
> тут описано почему такая ошибка возникает:
Не возникает никакой ошибки, это моя обёртка над ZLib. Причина - случайно нашёл файл, который паковался через нативный ZCompressStream, но обратно не распаковывался. Розыч говорил что-то, что у них там в кишках какой-то реальный косяк.
Через буфер же - всё нормально получилось.
Страницы: 1 вся ветка
Форум: "Основная";
Текущий архив: 2014.06.08;
Скачать: [xml.tar.bz2];
Память: 0.5 MB
Время: 0.002 c