Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > IT форум > Помощь студентам
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 05.04.2011, 14:20   #1
Claster
Форумчанин
 
Аватар для Claster
 
Регистрация: 02.09.2008
Сообщений: 340
По умолчанию Распаковать архив в поток

Привет всем........скажите каким образом можно Распаковать архив в поток, знаю что для этого необходимо установить компонент для работы с zip архивами, кто знает напишите какой компонент для этого лучше всего подойдет, и если можете то примерчик работы........я с этим не встречался.......вот появилась нужда........в интернете ничего толкового не нашол
Цитата:
- Только сисадмин может попросить у начальства 20$ на память...
Claster вне форума Ответить с цитированием
Старый 05.04.2011, 23:56   #2
Claster
Форумчанин
 
Аватар для Claster
 
Регистрация: 02.09.2008
Сообщений: 340
По умолчанию

Снова я как бы ни казалось со своим дурацким вопросом......и так полазив в нет еще побольше выяснилось что с этим может справится компонент fwzip http://www.delphisources.ru/pages/so...ar/fw-zip.html

Нашел кое какую информацию:

Распаковка архива:

Для распаковки архива применяется класс TFWZipReader
Порядок действий:
- создать TFWZipReader
- открыть архив вызовом методов LoadFromFile/LoadFromStream
- по необходимости назначить обработчик OnProgress
- автоматическая распаковка всего архива:
- если архив зашифрован, то передать список паролей свойству PasswordList или назначить обработчик OnPassword
- если предполагается работа с блоком ExData назначить обработчик OnLoadExData
- по необходимости назначить обработчик OnExeption. В нем вы будете принимать решение, продолжать распаковку архива при исключении или прервать.
- вызвать метод ExtractAll
- ручная распаковка поэлементно:
- выбрать необходимый элемент архива при помощи TFWZipReader.Item[Index] и вызвать метод Extract/ExtractToStream
- если предполагается работа с блоком ExData назначить обработчик OnLoadExData выбранному элементу
- если Extract/ExtractToStream вернул erNeedPassword, повторить вызов метода при этом указав верный пароль
- разрушить TFWZipReader


Вот этот клас:

Код:
  TFWZipReader = class
  private
    FZIPStream, FFileStream: TStream;
    FLocalFiles: TObjectList;
    FZip64EOFCentralDirectoryRecord: TZip64EOFCentralDirectoryRecord;
    FZip64EOFCentralDirectoryLocator: TZip64EOFCentralDirectoryLocator;
    FEndOfCentralDir: TEndOfCentralDir;
    FEndOfCentralDirComment: AnsiString;
    FOnProgress: TZipProgressEvent;
    FOnNeedPwd: TZipNeedPasswordEvent;
    FTotalSizeCount, FTotalProcessedCount: Int64;
    FPasswordList: TStringList;
    FOnLoadExData: TZipLoadExDataEvent;
    FException: TZipExceptionEvent;
    function GetItem(Index: Integer): TFWZipReaderItem;
  protected
    property ZIPStream: TStream read FZIPStream;
  protected
    function Zip64Present: Boolean;
    function SizeOfCentralDirectory: Int64;
    function TotalEntryesCount: Integer;
    procedure LoadStringValue(var Value: AnsiString; nSize: Cardinal);
    procedure LoadEndOfCentralDirectory;
    procedure LoadZIP64Locator;
    procedure LoadZip64EOFCentralDirectoryRecord;
    procedure LoadCentralDirectoryFileHeader;
  protected
    procedure DoProgress(Sender: TObject;
      const FileName: string; Extracted, TotalSize: Int64);
  public
    constructor Create;
    destructor Destroy; override;
    procedure Clear;
    function GetElementIndex(const FileName: string): Integer;
    procedure LoadFromFile(const Value: string);
    procedure LoadFromStream(Value: TStream);
    procedure ExtractAll(const Path: string);
    function Count: Integer;
    property Item[Index: Integer]: TFWZipReaderItem read GetItem; default;
    property Comment: AnsiString read FEndOfCentralDirComment;
    property PasswordList: TStringList read FPasswordList;
    property OnProgress: TZipProgressEvent read FOnProgress write FOnProgress;
    property OnPassword: TZipNeedPasswordEvent
      read FOnNeedPwd write FOnNeedPwd;
    property OnLoadExData: TZipLoadExDataEvent
      read FOnLoadExData write FOnLoadExData;
    property OnException: TZipExceptionEvent read FException write FException;
  end;

Пробую делать:

Код:
procedure TForm1.Button5Click(Sender: TObject);
var
DataStream:TMemoryStream;
FZIPStream:TStream;
Read: TFWZipReader;
Data:string;
i:integer;
begin
if Opendialog1.Execute then
begin
Data:=Opendialog1.FileName;
DataStream:=TMemoryStream.Create;
DataStream.LoadFromFile(Data);
DataStream.Read(i,SizeOf(i));
Read := TFWZipReader.Create;
Read.LoadFromStream(DataStream);

Read.ExtractAll('c:\ZipStream');

end;
 end;

Ход мыслей хоть правильно?
Цитата:
- Только сисадмин может попросить у начальства 20$ на память...
Claster вне форума Ответить с цитированием
Старый 06.04.2011, 14:03   #3
Claster
Форумчанин
 
Аватар для Claster
 
Регистрация: 02.09.2008
Сообщений: 340
По умолчанию

Всем привет это снова я.......и так архив распаковывается на диск C:\ а надо в поток в руководстве написано выбрать необходимый элемент архива при помощи TFWZipReader.Item[Index] и вызвать метод Extract/ExtractToStream

Делаю
Код:
Read := TFWZipReader.Create;
Read.LoadFromStream(DataStream);
Read.Item[Index].ExtractToStream(Rdata);
Read.Destroy;
Выходит ошибка о неизвестном идентификаторе Index, возможно я что-то не так делаю, скажите в чем ошибка как было бы правельнее с Item[Index] работать?
Цитата:
- Только сисадмин может попросить у начальства 20$ на память...
Claster вне форума Ответить с цитированием
Старый 06.04.2011, 15:41   #4
Claster
Форумчанин
 
Аватар для Claster
 
Регистрация: 02.09.2008
Сообщений: 340
По умолчанию

Допишу результат своих опытов, вдруг кому нибудь будет надо.....вобщем поковырявшись пришол к следующему:

Код:
procedure TForm1.Button1Click(Sender: TObject);
var
Read: TFWZipReader;
Data:string;
S: TStringStream;
i:integer;
begin
if Opendialog1.Execute then
begin
Data:=Opendialog1.FileName;
Read := TFWZipReader.Create;
Read.LoadFromFile(Data);


// Распаковка в поток:
    S := TStringStream.Create('');
    try
    Read[0].ExtractToStream(S, '');
     ShowMessage('Данные в потоке кол-во файлов = ' + IntToStr(Read.Count));
     Label1.Caption:= 'Кол-во элементов в архиве = ' + IntToStr(Read.Count);
    finally
    Read.Free;

end;
 end;
 end;

Все работает ура........
Цитата:
- Только сисадмин может попросить у начальства 20$ на память...
Claster вне форума Ответить с цитированием
Старый 02.06.2011, 20:12   #5
Rouse_
Пользователь
 
Аватар для Rouse_
 
Регистрация: 31.05.2007
Сообщений: 56
По умолчанию

Там в архиве идет папка с примерами использования данного класса, где как раз и рассмотрены все нюансы, в частности и работа с Item[Index]
Vae Victis
(Горе побежденным (лат.))
Демки с открытым кодом:
http://rouse.drkb.ru
Rouse_ вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Нужно распаковать файл sanek_sa Общие вопросы Delphi 2 30.01.2012 10:26
Поток. Не получается создать поток. Выдает ошибки при запуске bigory Общие вопросы по Java, Java SE, Kotlin 3 23.09.2010 00:40
как распаковать файл. sanek_sa Gamedev - cоздание игр: Unity, OpenGL, DirectX 9 06.11.2008 22:21
Распаковать БД? фЁдОр БД в Delphi 8 30.10.2007 06:18