Показать полную графическую версию : Сжатие файла
novashdima
14-09-2012, 03:02
Добрый день. Пытался использовать много разных компонентов, остановился пока на стандартном компоненте из rad studio xe2 - ZipFile, однако про него мало кто слышал, документация есть, но не совсем понятно, правильно ли я делаю. Итак, есть входной файл, я его сначала обрабатываю, потом сжимаю, попробовал сделать наоборот, сначала сжать, потом обработать, не помогло, при попытке сжать выдает AV C0x5. Думал, что просто напросто файл заблокирован, ловлю исключение EInOutError, ничего. Привожу часть кода:
FileInEdit, FileOutEdit: TsFilenameEdit;
strmInput, strmOutput: TFileStream;
ZipFile : TZipFile;
strmInput := TFileStream.Create(FileInEdit.FileName,fmOpenRead);
ZipFile.Add(FileInEdit.FileName, ExtractFileNameW(FileOutEdit.FileName), zcLZ77);
strmOutput := TFileStream.Create(FileOutEdit.FileName,fmOpenReadWrite);
Из того что есть, не видно:
1. Создается ли вначале файл - ZipFile := TZipFile.Create
2. Открывается ли он для записи - ZipFile.Open('опачки.zip', TZipMode.zmWrite);
Для чего такие сложности - ExtractFileNameW, наверное своя функция? С D2009 string, это юникод.
novashdima
14-09-2012, 14:01
Создается ли вначале файл - ZipFile := TZipFile.Create »
Когда прочитал ваше сообщение как ошпарило, ведь действительно ZipFile=nil
Открывается ли он для записи - ZipFile.Open('опачки.zip', TZipMode.zmWrite); »
Вот я и не знал, что его надо так открывать, в документации Embarcadero только описание объектов, а как применять не показано.
Для чего такие сложности - ExtractFileNameW, наверное своя функция? С D2009 string, это юникод. »
Я честно говоря не помню, под какой версией начинал писать эту прогу, скорее всего 2010, но знаю про стандартную фунцкию, но почему-то не применил ее, сейчас переправлю на стандартную. (Прога писалась год назад, сейчас она мне понадобилась, решил доработать и исправил несколько ошибок и говнокод, удивляюсь, как я мог такое написать).
Сейчас при попытка ZipFile.Add возникает такая ошибка:
---------------------------
Support for compression method not registered: PPMd version I, Rev 1.
---------------------------
И так с любым методом.
Support for compression method not registered: PPMd version I, Rev 1. »
uses System.Zip
novashdima
15-09-2012, 03:17
uses System.Zip »
есть такое, если бы не подключил, то мне компилятор написал бы, TZipFile - undeclared identifier
есть такое »
Я, не к тому написал, чтобы вы подключили, а к тому, что в модуле, всегда можно посмотреть код реализации.
novashdima
18-09-2012, 03:49
всегда можно посмотреть код реализации »
В данный момент изучаю, посмотрел половину модуля, увидел, что открываю правильно, потом нашел участок кода с извлечением:
class procedure TZipFile.ExtractZipFile(ZipFileName: string; Path: string);
var
LZip: TZipFile;
begin
LZip := TZipFile.Create;
try
LZip.Open(ZipFileName, zmRead);
LZip.ExtractAll(Path);
LZip.Close;
finally
LZip.Free;
end;
end;
То есть при извлечении делать Open не надо получается?
И вроде нашел код, в результате которого у меня вылетает ошибка в проге:
if not FCompressionHandler.ContainsKey(Compression) then
raise EZipException.CreateResFmt(@SZipNotSupported, [
TZipCompressionToString(Compression) ]);
© OSzone.net 2001-2012
vBulletin v3.6.4, Copyright ©2000-2025, Jelsoft Enterprises Ltd.
Available in ZeroNet 1osznRoVratMCN3bFoFpR2pSV5c9z6sTC