Компьютерный форум OSzone.net  

Компьютерный форум OSzone.net (http://forum.oszone.net/index.php)
-   Программирование и базы данных (http://forum.oszone.net/forumdisplay.php?f=21)
-   -   Сжатие файла (http://forum.oszone.net/showthread.php?t=242636)

novashdima 14-09-2012 03:02 1988372

Сжатие файла
 
Добрый день. Пытался использовать много разных компонентов, остановился пока на стандартном компоненте из 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);


opel431 14-09-2012 08:31 1988421

Из того что есть, не видно:
1. Создается ли вначале файл - ZipFile := TZipFile.Create
2. Открывается ли он для записи - ZipFile.Open('опачки.zip', TZipMode.zmWrite);

Для чего такие сложности - ExtractFileNameW, наверное своя функция? С D2009 string, это юникод.

novashdima 14-09-2012 14:01 1988610

Цитата:

Цитата opel431
Создается ли вначале файл - ZipFile := TZipFile.Create »

Когда прочитал ваше сообщение как ошпарило, ведь действительно ZipFile=nil
Цитата:

Цитата opel431
Открывается ли он для записи - ZipFile.Open('опачки.zip', TZipMode.zmWrite); »

Вот я и не знал, что его надо так открывать, в документации Embarcadero только описание объектов, а как применять не показано.

Цитата:

Цитата opel431
Для чего такие сложности - ExtractFileNameW, наверное своя функция? С D2009 string, это юникод. »

Я честно говоря не помню, под какой версией начинал писать эту прогу, скорее всего 2010, но знаю про стандартную фунцкию, но почему-то не применил ее, сейчас переправлю на стандартную. (Прога писалась год назад, сейчас она мне понадобилась, решил доработать и исправил несколько ошибок и говнокод, удивляюсь, как я мог такое написать).

Сейчас при попытка ZipFile.Add возникает такая ошибка:
---------------------------
Support for compression method not registered: PPMd version I, Rev 1.
---------------------------
И так с любым методом.

opel431 15-09-2012 03:01 1988956

Цитата:

Цитата novashdima
Support for compression method not registered: PPMd version I, Rev 1. »

uses System.Zip

novashdima 15-09-2012 03:17 1988958

Цитата:

Цитата opel431
uses System.Zip »

есть такое, если бы не подключил, то мне компилятор написал бы, TZipFile - undeclared identifier

opel431 17-09-2012 22:16 1990522

Цитата:

Цитата novashdima
есть такое »

Я, не к тому написал, чтобы вы подключили, а к тому, что в модуле, всегда можно посмотреть код реализации.

novashdima 18-09-2012 03:49 1990637

Цитата:

Цитата opel431
всегда можно посмотреть код реализации »

В данный момент изучаю, посмотрел половину модуля, увидел, что открываю правильно, потом нашел участок кода с извлечением:
Код:

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) ]);



Время: 19:07.

Время: 19:07.
© OSzone.net 2001-