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

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

Вернуться   Форум программистов > Delphi программирование > Общие вопросы Delphi
Регистрация

Восстановить пароль

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

Ответ
 
Опции темы Поиск в этой теме
Старый 18.08.2013, 23:29   #1
LomoCoder
Пользователь
 
Регистрация: 27.07.2013
Сообщений: 47
Восклицание Compress\Decompress

Здравствуйте! Я делаю самораспаковывающийся архив sfx, для сжатия и распаковки использую такие 2 функции:
Код:
procedure CompressFiles(Files : TStrings; const Filename : String);
 var
   infile, outfile, tmpFile : TFileStream;
   compr : TCompressionStream;
   i,l : Integer;
   s : String;

 begin
   if Files.Count > 0 then
   begin
     outFile := TFileStream.Create(Filename,fmCreate);
     try
       { the number of files }
       l := Files.Count;
       outfile.Write(l,SizeOf(l));
       for i := 0 to Files.Count-1 do
       begin
         infile := TFileStream.Create(Files[i],fmOpenRead);
         try
           { the original filename }
           s := ExtractFilename(Files[i]);
           l := Length(s);
           outfile.Write(l,SizeOf(l));
           outfile.Write(s[1],l);
           { the original filesize }
           l := infile.Size;
           outfile.Write(l,SizeOf(l));
           { compress and store the file temporary}
           tmpFile := TFileStream.Create('tmp',fmCreate);
           compr := TCompressionStream.Create(clMax,tmpfile);
           try
             compr.CopyFrom(infile,l);
           finally
             compr.Free;
             tmpFile.Free;
           end;
           { append the compressed file to the destination file }
           tmpFile := TFileStream.Create('tmp',fmOpenRead);
           try
             outfile.CopyFrom(tmpFile,0);
           finally
             tmpFile.Free;
           end;
         finally
           infile.Free;
         end;
       end;
     finally
       outfile.Free;
     end;
     DeleteFile('tmp');
   end;
 end;
Код:
procedure DecompressFiles(const Filename, DestDirectory : String);
var
 s:String;
 decompr : TDecompressionStream;
 infile, outfile : TFilestream;
 i,l,c : Integer;
begin
 infile := TFileStream.Create(Filename,fmOpenRead);
 try
   { number of files }
   infile.Read(c,SizeOf(c));
   for i := 1 to c do
   begin
     { read filename }
     infile.Read(l,SizeOf(l));
     s := '';
     SetLength(s,l);
     infile.read(s[1], l);

     { read filesize }
     infile.Read(l,SizeOf(l));
     { decompress the files and store it }
     s := DestDirectory+s; //include the path
     outfile := TFileStream.Create(s,fmCreate);
     decompr := TDecompressionStream.Create(infile);
     try
       outfile.CopyFrom(decompr,l);
     finally
       outfile.Free;
       decompr.Free;
     end;
   end;
 finally
   infile.Free;
 end;
end;
Так вот, запаковывает отлично, если запаковать и не закрывая программу распаковать то распакует тоже хорошо, но вот проблема в том, что если запаковать, потом закрыть программу, потом опять открыть программу и распаковать уже созданный файл, то файлы распакуются без расширений тобиш вот так:

Подскажите в чем проблема, я уже весь мозг сломал не могу найти этот прикол.
LomoCoder вне форума Ответить с цитированием
Старый 19.08.2013, 00:51   #2
Человек_Борща
Старожил
 
Аватар для Человек_Борща
 
Регистрация: 30.12.2009
Сообщений: 11,430
По умолчанию

Откуда программе знать какие имена были у файлов до распаковки?
Вот и реализуйте это. Пусть в архиве живет 1.ini где прописана атрибутика файлов в архиве.
Человек_Борща вне форума Ответить с цитированием
Старый 19.08.2013, 08:23   #3
Stilet
Белик Виталий :)
Старожил
 
Аватар для Stilet
 
Регистрация: 23.07.2007
Сообщений: 57,097
По умолчанию

А то что пакуется в архив, там имя файла с расширением попадает?
I'm learning to live...
Stilet вне форума Ответить с цитированием
Старый 19.08.2013, 12:33   #4
LomoCoder
Пользователь
 
Регистрация: 27.07.2013
Сообщений: 47
По умолчанию

Цитата:
Сообщение от Stilet Посмотреть сообщение
А то что пакуется в архив, там имя файла с расширением попадает?
Да, он ведь распаковывает отлично до перезапуска программы

Цитата:
Сообщение от Человек_Борща Посмотреть сообщение
Откуда программе знать какие имена были у файлов до распаковки?
Дак вот именно то что он знает имена файлов, а расширения теряет куда то после перезапуска программы.

Последний раз редактировалось Stilet; 19.08.2013 в 13:55.
LomoCoder вне форума Ответить с цитированием
Старый 19.08.2013, 13:56   #5
Stilet
Белик Виталий :)
Старожил
 
Аватар для Stilet
 
Регистрация: 23.07.2007
Сообщений: 57,097
По умолчанию

Цитата:
Да, он ведь распаковывает отлично до перезапуска программы
И всетки я бы в HEX редакторе проверил - не поленился.
Если там все в норме значит нужно тестировать функу распаковки пошагово.
Я тоже так делал, как у тебя в коде, и проблем вроде не вижу, но мало ли...
I'm learning to live...
Stilet вне форума Ответить с цитированием
Старый 19.08.2013, 14:38   #6
LomoCoder
Пользователь
 
Регистрация: 27.07.2013
Сообщений: 47
По умолчанию

Хехе, в дельфи 7 сделал все нормально работает, а в рад студии ХЕ4 походу какой-то косяк в пас файлах, но динозавр меня никак не устраивает.

Последний раз редактировалось LomoCoder; 19.08.2013 в 14:42.
LomoCoder вне форума Ответить с цитированием
Старый 19.08.2013, 15:05   #7
Stilet
Белик Виталий :)
Старожил
 
Аватар для Stilet
 
Регистрация: 23.07.2007
Сообщений: 57,097
По умолчанию

Ха! Так наверное там с юникодом проблема?
а-ну замени все String на AnsiString.
I'm learning to live...
Stilet вне форума Ответить с цитированием
Старый 19.08.2013, 15:12   #8
LomoCoder
Пользователь
 
Регистрация: 27.07.2013
Сообщений: 47
По умолчанию

Ага точняк, даже и не подумал, спасибо!
LomoCoder вне форума Ответить с цитированием
Ответ


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



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Ошибка JPEGImage->Compress() DeGroup C++ Builder 1 23.04.2012 16:30
Compress Picture a_zheshko Microsoft Office Word 4 11.04.2011 11:48