Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > Delphi: Для новичков > Склеивание файлов


Автор: sani79 10.4.2006, 18:42
Народ, подскажите плиз самый простой способ склеивания файлов. То есть нужно получить что то типа архива, только без компрессии, а потом снова разобрать на исходные файлы. Компоненты не подходят. Может есть у когонибудь код процедурки? Или может кто нибудь просто подскажет самый простой способ. Заранее спасибо.

Автор: SoWa 10.4.2006, 18:46
Самый просто способ если не знаешь TFileStream- склеивать по байтам smile
Но лучше почитать про TFileStream и просто все сделать за пару строк. Не забудь в конце файла дописывать информацию о вклееных файлах.

Автор: sani79 10.4.2006, 18:49
Хм.. Спасибо за идею... Так если в пару строк, может их опубликовать? Вдруг кому еще пригодится, да и разобраться проще будет....

Автор: Snowy 10.4.2006, 18:50
http://forum.vingrad.ru/index.php?showtopic=40647&view=findpost&p=313213

Автор: sani79 10.4.2006, 18:52
Спасибо Snowy, это то что нужно. Щас буду пробовать.

Автор: Snowy 10.4.2006, 18:58
Эта проблема поднимается уже в 99-й раз.
А у меня все руки не доходят мою утилиту дописать.
Все. Решительно берусь.
Пошел писать...

Автор: sani79 10.4.2006, 19:00
Еще раз спасибо. Кстати на форуме не нашел (видно плохо искал). И в drkb. Пошел писать тоже smile

Автор: former 11.4.2006, 00:03
Snowy, попробовал кад предложенный в тобой, только упаковывал файлы разных типов (txt, jpg, bmp).

А при попытки выполнить следующий код ничего не происходит: smile

Код

procedure TForm1.Button2Click(Sender: TObject);
var
 m: TMemoryStream;
begin
 m:=TMemoryStream.Create;
 Load('archiv.prt','pict.bmp',m);
 Image1.Picture.Bitmap.LoadFromStream(m);
 m.Free;
end;


Что не так?

Автор: sani79 11.4.2006, 09:33
хмм.. 1: ну во первых получил ошибку при компиляции в процедуре save:
[Error] Unit1.pas(142): Incompatible types: 'TPersistent' and 'file'
[Fatal Error] Project1.dpr(9): Could not compile used unit 'Unit1.pas'

проблема решилась заменой assign на assignfile. Запись прошла. Размер архива навскидку правильный. Все отлично.
2. Процедура load: во первых понятно что максимальное имя файла 8 символов (задается в типе TFileNfo), мне это не удобно, заменил на 100.
Ладно, но в итоге я получил файл размером в 5 байт (?), что естественно не является содержимым извлекаемого файла.

Сейчас продолжаю трассировать. Есть у кого нибудь коментарии? Snowy?

Автор: Snowy 11.4.2006, 09:53
Комментарии отсутствуют. У меня все отлично работает.
Проверил - битмапа грузится без проблем.

Автор: Alexeis 11.4.2006, 10:09
sani79, у меня работает такой код
Код


procedure TForm1.Button1Click(Sender: TObject);
 var
  f1, f2, fr : TFileStream;
  d, l : Integer;
  s : AnsiString;

begin
  f1 := TFileStream.Create(ExtractFilePath(application.exename)+'1.txt', fmOpenRead);
  f2 := TFileStream.Create(ExtractFilePath(application.exename)+'2.wav', fmOpenRead);
  fr := TFileStream.Create(ExtractFilePath(application.exename)+'Result.dat', fmCreate);
  f1.Seek(0, soFromBeginning);
  f2.Seek(0, soFromBeginning);
  fr.Seek(0, soFromBeginning);

  d := f1.Size;
  s := '1.txt';
  l := length(s);

  fr.WriteBuffer(d, 4);
  fr.WriteBuffer(l, 4);
  fr.WriteBuffer(s[1], l);

  fr.CopyFrom(f1, f1.Size);

  d := f2.Size;
  s := '2.wav';
  l := length(s);

  fr.WriteBuffer(d, 4);
  fr.WriteBuffer(l, 4);
  fr.WriteBuffer(s[1], l);

  fr.CopyFrom(f2, f2.Size);
  f1.Free;
  f2.Free;
  fr.Free;
end;

procedure TForm1.Button2Click(Sender: TObject);
 var
  f1, fr : TFileStream;
  d, l : Integer;
  s : AnsiString;

begin
  fr := TFileStream.Create(ExtractFilePath(application.exename)+'Result.dat', fmOpenRead);
  fr.Seek(0, soFromBeginning);

  fr.ReadBuffer(d, 4);
  fr.ReadBuffer(l, 4);
  SetLength(s, l);
  fr.ReadBuffer(s[1], l);

  f1 := TFileStream.Create(ExtractFilePath(application.exename)+s, fmCreate);
  f1.Seek(0, soFromBeginning);
  f1.CopyFrom(fr, d);
  f1.Free;

  fr.ReadBuffer(d, 4);
  fr.ReadBuffer(l, 4);
  SetLength(s, l);
  fr.ReadBuffer(s[1], l);

  f1 := TFileStream.Create(ExtractFilePath(application.exename)+s, fmCreate);
  f1.Seek(0, soFromBeginning);
  f1.CopyFrom(fr, d);
  f1.Free;
end;

Добавлено @ 10:15
Файлы последовательно будут записываться button1, а затем последовательно извлекатся button2(в том порядке в котором были записаны). Число файлов естественно не ограничивается двумя.

Автор: sani79 11.4.2006, 10:24
alexeis1, Спасибо, этот код у меня отработал как нужно. Все получилось. Странно что не работает вышеописанный код от Snowy, я уверен что он должен работать тоже. Попытаюсь все таки разобраться. Ради спортивного интереса. Всем спасибо!

Автор: Alexeis 11.4.2006, 10:43
sani79, Я переделал код поприличней на много файлов
вот привожу
Код

procedure SaveFiles(files : TStringList;ResutName : AnsiString);
 var
  f, fr : TFileStream;
  d, l, i : Cardinal;
  s : AnsiString;

begin
  fr := TFileStream.Create(ResutName, fmCreate);
  fr.Seek(0, soFromBeginning);
 
  For i := 0 to files.Count - 1
  do
    Begin
      s := Files.Strings[i];
      f := TFileStream.Create(s, fmOpenRead);
      f.Seek(0, soFromBeginning);

      d := f.Size;
      l := length(s);

      fr.WriteBuffer(d, 4);
      fr.WriteBuffer(l, 4);
      fr.WriteBuffer(s[1], l);

      fr.CopyFrom(f, f.Size);

      d := $AAAA;
      fr.WriteBuffer(d, 4);

      f.Free;
    end;

  fr.Seek(-4, soFromCurrent);
  d := $FFFF;
  fr.WriteBuffer(d, 4);
  
  fr.Free;
end;

procedure ExtractFiles(SourceName : AnsiString);
 var
  f, fr : TFileStream;
  d, l : Cardinal;
  s : AnsiString;

begin
  fr := TFileStream.Create(ExtractFilePath(application.exename)+'Result.dat', fmOpenRead);
  fr.Seek(0, soFromBeginning);

  Repeat
    fr.ReadBuffer(d, 4);
    fr.ReadBuffer(l, 4);
    SetLength(s, l);
    fr.ReadBuffer(s[1], l);

    f := TFileStream.Create(s, fmCreate);
    f.Seek(0, soFromBeginning);
    f.CopyFrom(fr, d);
    f.Free;

    fr.ReadBuffer(d, 4);

  until d = $FFFF;
end;

procedure TForm1.Button1Click(Sender: TObject);
 var
  n : TStringList;

begin
  n := TStringList.Create;
  if opendialog1.Execute
  then
    Begin
      n.AddStrings(opendialog1.Files);
      SaveFiles(n, ExtractFilePath(application.ExeName) + 'Result.dat');
    end;
end;

procedure TForm1.Button2Click(Sender: TObject);
begin
  ExtractFiles(ExtractFilePath(application.ExeName) + 'Result.dat');
end;

Добавлено @ 10:44
Кстати побайтовое сравнение распакованных и исходных показало полное совпадение

Автор: sani79 11.4.2006, 10:56
Да все работает на отлично. Я проверял dbfами. Никаких потерь.

Автор: Snowy 11.4.2006, 11:24
Долго пишу. Вот собрал 2 класса:
* TFilesSaver - сохраняет кучу файлов в один
* TFilesLoader - загружает файлы из пака
Код
unit FilesWork;
{* Модуль для сохранения множества файлов в один и обратного извлечения }

interface

uses Windows, SysUtils, Classes;

type
  TFilesSaver = class
  {* класс - сохраняет файлы в пак }
  private
    FFile:  string;
  public
    FileList: TStringList;
    {* здесь список файлов с полными путями }
    function Add(FileName: string): integer;
    {*  добавляет файл в список. Допустимы маски *.* f???.bmp т.п.}
    procedure Save;
    {* Собственно сохраняет все файлы }
    constructor Create(FileName: string);
    {* конструктор. При создании задаем имя итогового файла }
    destructor Destroy; override;
    {* деструктор }
  end;

  TFilesLoader = class
  {* класс - читает файлы из пака }
  private
    FFile: string;
  public
    FileList: TStringList;
    {* список файлов в паке. }
    constructor Create(FileName: string);
    {* конструктор. При создании задаем имя файла-пака. Заполняет FileList }
    destructor  Destroy; override;
    {* Деструктор }
    procedure GetFile(FileName: string; st: TStream); overload;
    {* Взять файл из пака. На входе имя файла и любой потомок TStream }
    procedure GetFile(Index: integer; st: TStream); overload;
    {* Перегруженная GetFile, для обращения по индексу, а не имени }
    procedure SaveFile(FileName, DestFile: string);
    {* Пример использования GetFile на основе TFileStream.
       Сохраняет файл FileName из пака в файл с именем DestFile }
  end;

implementation

// TFilesSaver

constructor TFilesSaver.Create(FileName: string);
begin
  inherited Create;
  FileList := TStringList.Create;
  FFile := FileName;
end;

destructor TFilesSaver.Destroy;
begin
  inherited;
  FileList.Free;
end;

function TFilesSaver.Add(FileName: string): integer;
var
  sr: TSearchRec;
begin
  result := 0;
  if FindFirst(FileName, $20, sr) = 0 then
  begin
    repeat
      if (sr.Attr and $20) = $20 then
      begin
        FileList.Add(ExtractFilePath(FileName) + sr.Name);
        inc(result);
      end;
    until FindNext(sr) <> 0;
    FindClose(sr);
  end;
end;

procedure TFilesSaver.Save;
var
  fa, fc: TFileStream;
  ms:     TMemoryStream;
  i, d:   dword;
  b:      byte;
  s:      string;
begin
  try fa := TFileStream.Create(FFile, fmCreate or fmShareDenyWrite);
  except Exit; end;
  ms := TMemoryStream.Create;
  d := 0; fa.Write(d, SizeOf(d));
  for i := 0 to FileList.Count - 1 do
  try
    fc := TFileStream.Create(FileList[i], fmOpenRead or fmShareDenyWrite);
    try
      s := ExtractFileName(FileList[i]);
      b := Length(s); ms.Write(b, 1); ms.Write(s[1], b);
      d := fa.Position; ms.Write(d, SizeOf(d));
      d := fc.Size; ms.Write(d, SizeOf(d));
      fa.CopyFrom(fc, fc.Size);
    finally fc.Free; end;
  except end;
  d := fa.Position;
  ms.Position := 0; fa.CopyFrom(ms, ms.Size);
  fa.Position := 0; fa.Write(d, SizeOf(d));
  ms.Free; fa.Free;
end;


// TFilesLoader

constructor TFilesLoader.Create(FileName: string);
var
  fs: TFileStream;
  d:  dword;
  b:  byte;
  s:  string;
begin
  inherited Create;
  FileList := TStringList.Create;
  FFile := FileName;
  try fs := TFileStream.Create(FFile, fmOpenRead or fmShareDenyWrite);
    try
      fs.Read(d, SizeOf(d)); fs.Position := d;
      repeat
        fs.Read(b, SizeOf(b)); SetLength(s, b);
        fs.Read(s[1], b); d := fs.Position;
        FileList.AddObject(s, pointer(d));
        fs.Read(d, SizeOf(d)); fs.Read(d, SizeOf(d));
      until fs.Position >= fs.Size;
    finally fs.Free; end;
  except end;
end;

destructor TFilesLoader.Destroy;
begin
  FileList.Free;
  inherited;
end;

procedure TFilesLoader.GetFile(Index: integer; st: TStream);
var
  fs:  TFileStream;
  d,o: dword;
begin
  fs := TFileStream.Create(FFile, fmOpenRead or fmShareDenyWrite);
  try
    fs.Position := dword(FileList.Objects[Index]);
    fs.Read(o, SizeOf(o)); fs.Read(d, SizeOf(d));
    fs.Position := o; st.CopyFrom(fs, d);
  finally fs.Free; end;
  st.Position := 0;
end;

procedure TFilesLoader.GetFile(FileName: string; st: TStream);
var i: integer;
begin
  i := FileList.IndexOf(FileName);
  if i >= 0 then GetFile(i, st);
end;

procedure TFilesLoader.SaveFile(FileName, DestFile: string);
var
  fs: TFileStream;
begin
  if FileList.IndexOf(FileName) < 0 then Exit;
  try fs := TFileStream.Create(DestFile, fmCreate or fmShareDenyWrite);
    GetFile(FileName, fs);
    fs.Free;
  except end;
end;

end.


Пример использования:
Код

// Кнопка1 - сохраняет кучу файлов в пак
procedure TForm1.Button1Click(Sender: TObject); // создаем пак
begin
  with TFilesSaver.Create('C:\file.pak') do
  begin
    Add('C:\*.bmp'); // добавляем в список файлы
    Add('C:\*.mp3');
    Add('C:\*.rar');
    Save; Free;     // сохраняем пак, уничтожаем класс
  end;
end;

// Кнопка2 - распаковать файлы на диск
procedure TForm1.Button2Click(Sender: TObject);
const path := 'C:\UnPack\';
var i: integer;
begin
  ForceDirectories(path); // создаем каталог для распаковки
  with TFilesLoader.Create('C:\file.pak') do // читаем пак
  begin
    for i := 0 to FileList.Count - 1 do // идем по списку файлов
      SaveFile(i, path + FileList[i]); // сохраняем файл
    Free; // убиваем распаковщик
  end;
end;

// Кнопка3 - читает первый файл из пака, загружает его в Image1
procedure TForm1.Button3Click(Sender: TObject);
var ms: TMemoryStream;
begin
  ms := TMemoryStream.Create;
  with TFilesLoader.Create('C:\file.pak') do // читаем пак
  begin
    GetFile(FileList[0], ms); // берем первый файл в MemoryStream
    Free;
  end;
  Image1.Picture.Bitmap.LoadFromStream(ms); // грузим из стрима в картинку
  ms.Free;
end;
P.S. Сохраняются только имена файлов, а не полный путь.
Поэтому есть вероятность того, что в список попадут файлы с одинаковыми именами.
Запишутся они корректно и прочитаются тоже. Просто осторожней с сохранением на диск.

Автор: Alexeis 1.12.2006, 16:26
По просьбе одного из участников выкладываю код извлечения имен файлов из архива.

Код

function GetFileNames(SourceName : AnsiString) : TStringList;
 var
  f, fr : TFileStream;
  d, l : Cardinal;
  s : AnsiString;
begin
  Result := TStringList.Create;
  fr := TFileStream.Create(ExtractFilePath(application.exename)+'Result.dat', fmOpenRead);
  fr.Seek(0, soFromBeginning);
  Repeat
    fr.ReadBuffer(d, 4);
    fr.ReadBuffer(l, 4);
    SetLength(s, l);
    fr.ReadBuffer(s[1], l);
    Result.add(s);
    fr.Seek(d, soFromCurrent);
    fr.ReadBuffer(d, 4);
  until d = $FFFF;
end;

Автор: Evghenusi 1.12.2006, 16:58
alexeis1 если тебе не трудно напиши как можно из файла "Result.dat" вытащить
названия склеенных файлов в Listbox

я написал такой код, но чтото не получается: 

Код

var
n:TStringList;
fr:TFileStream;
begin
fr:=TFileStream.Create(Form1.Edit1.text+Form1.Edit2.text, fmOpenRead);
n:=TStringList.Create;
n.LoadFromStream(fr);
ListBox1.Items.AddStrings(n);

 smile   smile 

Автор: Alexeis 1.12.2006, 17:43
Evghenusi, ага я чуть-чуть опредил, решение выше smile

Автор: Evghenusi 1.12.2006, 21:24
alexeis1

покажи мне, пожалуйста, где указывается
адрес для распаковки файлов

Автор: Alexeis 1.12.2006, 23:06
Цитата(Evghenusi @  1.12.2006,  21:24 Найти цитируемый пост)
покажи мне, пожалуйста, где указывается
адрес для распаковки файлов


А вот же 
Цитата

    f := TFileStream.Create(s, fmCreate);
    f.Seek(0, soFromBeginning);
    f.CopyFrom(fr, d);
    f.Free;

путь идет тот который записан, т.е. то что в переменной s если охота то можно добавить к нему путь к нужной папке.

Автор: Evghenusi 2.12.2006, 00:08
я тоже сначала подумал что "S" это путь к папке
но выходит ошибка.
скачай архив и посмотри рисунок!

Автор: Alexeis 2.12.2006, 02:09
Ничего удивительного я же не сказал туда писать директорию распаковки, а путь к файлу, т.е. это будет выглядеть так:
f := TFileStream.Create(DirPath + s, fmCreate);
где в DirPath - будет путь к папке для извлечения. При конкатинации мы получим полный путь к каждому из файлов для сохранения. 
  Похоже вы не поняли как работает этот код...

Автор: Evghenusi 2.12.2006, 10:27
Цитата(alexeis1 @ 2.12.2006,  02:09)
  Похоже вы не поняли как работает этот код...


да ты прав!
но я сделал как ты сказал, и выходит ошибка,
путь получается 'C:\temt\C:\files\'
путь куда я хочу извлечь и папка, откуда я брал файлы

Автор: Alexeis 2.12.2006, 16:10
Evghenusi, если вы не хотите разбираться в сути, то используйте класс написанный Snowy он по крайней мере полнофункциональный (законченый), я же просто привел принцип для примера, как это делается.

Автор: Danя 14.5.2007, 19:10
Как добавить файлы в уже созданый архив (*.pak) smile 

Автор: Snowy 15.5.2007, 13:37
Модификация паков не предусмотрена.
Написать можно.
Но цель была - создать 2 отдельных класса.
1 - для подготовки данных, которые будут использоваться в программе.
2 - для получения этих данных.
В конечной программе подразумевалось использование только второго класса.
Если нужно оба + модификация, то нужно писать один единый класс.
Цель кода - не архиватор, а подготовка данных для использования в программе.
Если нужен архиватор, то для этого нужно использовать соответствующие компоненты, либо подождать, когда я допишу свою утилиту...

Автор: Danя 15.5.2007, 16:48
Ну может все таки можно как - то быстро добавить файлы в архив smile 
Я быстренько написал програмку которая упоковывает 6 файлов в архив и распоковывает файлы из какого-либо архива.
Я делаю игру и мне нужно чтобы изображения (а возможно в дальнейшем и звуки) она [игра] брала из архива, который я сам создам, но так как изображений все больше и больше приходится каждый раз пересоздавать архив, а это очень нудно smile  smile 

Автор: Snowy 15.5.2007, 17:00
Быстро добавить можно.
А вот быстро написать новый единый клас не получится - много переделывать.

Автор: Danя 15.5.2007, 17:10
Тогда скажи как папку засунуть в архив (*.pak) smile 

Автор: Snowy 15.5.2007, 17:35
Пофайлово - сканишь файлы FindFirst/FindNext, добавляешь каждый по Add.

Автор: Danя 15.5.2007, 18:02
Snowy 
Пожалуйста поподробнее, я почти новичок в DELPHI smile  smile  smile  smile 

Автор: lukas 15.5.2007, 18:44
Danя, 

все же просто... 

находишь один файл, загружаешь его в TMemoryStream, затем копируешь весь этот поток в конец главного потока например DirectStream (TMemoryStream) и так дальше, с каждым найденным файлом... ;) А потом DirectStream сохраняешь в файл. Для начала научись с потоками работать, а там и сам все поймешь...

Автор: Danя 15.5.2007, 19:05
lukas, 
 smile  smile Да.... за время которое я нахожусь на этом форуме я понял, что DELPHI вообще нифига не знаю smile  smile 
Пожалуйста можешь объяснить у меня очень мало времения!!!
Мне через неделю показывать игру(хоть в каком - то виде), а у меня нифига ни сделано


Автор: Snowy 15.5.2007, 19:05
lukas, человек спрашивал, как пользоваться FindFirst, а не теорию склеивания.
К тому же со склеиванием всё давно решено - код в топе.

Danя, видишь поле поиска вверху страницы? Введи туда FindFirst ;-)

Автор: Danя 15.5.2007, 19:21
Snowy, 
Издеваешься да? smile 
Но всёравно спасибо smile

Добавлено @ 19:25
Код

Procedure FindDirInDir(const indir:AnsiString;const wStringList: TStrings;const filemast:AnsiString='*.*');
var ssr : TSearchRec;
begin
  wStringList.Clear;
  if FindFirst(indir+filemast, faAnyFile, ssr)=0 then
    repeat
      if ((ssr.Attr and faDirectory)<>0) and (ssr.Name<>'..') and (ssr.Name<>'.') then
        wStringList.add(ssr.Name);
    until FindNext(ssr)<>0;
  SysUtils.FindClose(ssr);
end;

procedure TForm1.Button1Click(Sender: TObject);
begin
FindDirInDir('C:\Program Files',Listbox1.Items,'*.*');
end;

Ну а как не папки а название файлов  в Листбокс  вывести??
Вы не думайте я не леньтяй просто архивация это второе дело (но не менее важное) главное саму игрушку дописать/написать

Автор: Danя 15.5.2007, 20:25
Все ДОШЛО!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! smile  smile  smile  smile  smile  smile  smile  smile  smile  smile  smile  smile  smile  smile  smile 


УРЯЯЯЯЯЯЯЯЯЯЯЯЯЯЯЯЯЯЯЯЯЯ smile 


ВСЕМ ОГРОМНОЕ СПАСИБО

ПРОСТИТЕ, ЧТО ТУПИЛ





Автор: _KLAUS_ 7.8.2007, 18:20
Snowy, 
Что делаю не так??
Три кнопки, нажимаю на первую создаётся "file.pak"
На вторую создаётся папка "UnPack" - Но она пустая .....
На третью пишет "Bitmap is not avalid"..что не так-то??
Delphi 6

Автор: _KLAUS_ 7.8.2007, 18:46
Ошибка 
Код

Image1.Picture.Bitmap.LoadFromStream(ms);
  

Я так понял, мы все нужные файлы в картинку пихаем, а как извлекать??

Автор: Snowy 7.8.2007, 20:01
Цитата(_KLAUS_ @  7.8.2007,  18:20 Найти цитируемый пост)
Что делаю не так??
Три кнопки, нажимаю на первую создаётся "file.pak"
На вторую создаётся папка "UnPack" - Но она пустая .....
На третью пишет "Bitmap is not avalid"..что не так-то??

Неверно указал пути к файлам при упаковке.
Посмотри размер pak - он небось байта 4.
Значит ничего не запаковал. А значит и распаковывать нечего smile 
Цитата(Snowy @  11.4.2006,  11:24 Найти цитируемый пост)
    Add('C:\*.bmp'); // добавляем в список файлы
    Add('C:\*.mp3');
    Add('C:\*.rar');
Видишь что пакует?
У тебя в корне диска C: есть bmp, mp3 или rar?
Нет? Вот потому ничего и не упаковал.


Цитата(_KLAUS_ @  7.8.2007,  18:46 Найти цитируемый пост)
Я так понял, мы все нужные файлы в картинку пихаем, а как извлекать??
Нет. Нужные файлы мы никуда не пихаем.
Они так и лежат в файле.
Просто мы можем достать оттуда любой из файлов в стрим.
В примере с картинкой мы вытаскиваем из пака первый файл в TMemoryStream, а потом этот стрим грузим в битмап.
Почему первый? Да потому что при добавлении мы сначала добавляли bmp.
Можно указывать не по звёздочке, а конкретный файл. Но это детали.
Файлы сами по себе не достаются. Их нужно доставать через  GetFile.
GetFile найдёт в паке выбранный файл (если он там есть) и прочитает его в стрим.
А дальше что хошь с ним, то и делай.

Автор: _KLAUS_ 8.8.2007, 06:32
Цитата(Snowy @ 7.8.2007,  20:01)
Неверно указал пути к файлам при упаковке.
Посмотри размер pak - он небось байта 4.
Значит ничего не запаковал. А значит и распаковывать нечего 

Да не, всё нормально, я правда только свои форматы  запихал, а так они в корневом каталоге C:\ лежат , и  *.pak получился нормального размера! Но папка UnPack всё равно пустая.
И вот тут если я меняю значения на >0 , то файлы извлекаются но с нулевым размером!!
Код

 if FileList.IndexOf(FileName) < 0 then Exit;


Добавлено через 3 минуты и 43 секунды
Извлечение что-то не получается!!

Автор: lukas 14.9.2007, 18:35
Откопал похожий компонент...

TStreamDirector, может добавлять Файлы, Потоки, Списки... вообще тоже очень удобно...


Автор: lukas 14.9.2007, 18:37
и вот еще один похожий...

http://www.torry.net/vcl/vcltools/streams/hkstrm.zip

Автор: Apls 6.11.2007, 23:11
Snowy, соглашусь с _KLAUS_. Сейчас разбираюсь с твоим исходником, тоже самое.
Создается папка UnPack, но файло в ней нет, если в процедуре TFilesLoader.SaveFile поменять знак на ">", то файлы извлекаются, но с нулевым размером. Что делать?

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)