Pakowanie plików z poziomu prgramu

0

Witajcie,

Potrzebuje z poziomu kodu, bez dodawania dodatkowych bibliotek zamienić katalog z kilkoma plikami (głównie *.txt) w jeden plik, najlepiej z kompresją. Szukałem dużo jak zamienić w zip ale albo wymagało to zewnętrznych bibliotek albo po prostu stworzone pliki zip nie działały (nie można było odczytać). Macie jakieś pomysły? Jakieś CAB-y albo coś?

0

Skoro nie chcesz korzystać z zewnętrznych bibliotek to sam musisz zaimplementować kompresję do zip. Algorytm LZMA. Innego rozwiązania nie ma. Oczywiście można sobie darować kompresję i wrzucać do pliku pliki nieskompresowane.

*edit: no i oczywiście musisz jeszcze zaimplementować zapisywanie danych do pliku w odpowiednim formacie: http:*www.pkware.com/documents/casestudies/APPNOTE.TXT

1

Ja jak pisałem binder w Asemblerze to użyłem biblioteki do kompresji o nazwie aPLib.

0

Dziękuje wszystkim za odpowiedzi. Tak Program będzie tylko pod Windows, dzisiaj przetestuję wasze sugestie.

0

bez dodawania dodatkowych bibliotek
A co, masz alergię na biblioteki?

Szukałem dużo jak zamienić w zip ale albo wymagało to zewnętrznych bibliotek albo po prostu stworzone pliki zip ...
Wklejenie czyjegoś kodu do twojej aplikacji niczym się nie różni od użycia biblioteki. Niektóre biblioteki dostarczane są w postaci samych nagłówków kodu źródłowego i trzeba je tylko wstawić do swojego kodu (wkleić a najlepiej zaincludować). To czy biblioteka jest już skompilowana czy nie nie robi tu żadnej różnicy.

Bartosz Wójcik napisał(a):

skorzystaj z funkcji RtlCompressBuffer

marcel.slip napisał(a):

dzisiaj przetestuję wasze sugestie
WinAPI to też biblioteka.

Tak więc o co ci chodzi z tą "biblioteką"? Coś czuję, że pobłądziłeś synu, wróć na drogę światłości...

0

@adf88 Aplikacja ma być maksymalnie mała i być w jednym pliku exe oraz działać na "czystym systemie" bez aktualizacji VC itd. Ja nie mam awersji do bibliotek i z miłą chęcią bym jakiejś użył i już to skończył, takie wymogi są. Tylko też rozróżnijmy biblioteki *.h które mogę dodawać jako część kodu oraz biblioteki *.dll które nie są mile widziane;) nawet jako zasoby lub części bibliotek które muszą być wcześniej zainstalowane w systemie.

2

To plik exe będzie musiał mieć statycznie linkowane biblioteki Visual'a. Jak statycznie podlinkujesz jakiegoś liba do obsługi zip'ów to zawsze otrzymujesz jeden niezależny plik exe ;) - np. to http://www.sharewareconnection.com/chilkat-zip-compression-visual-c-library.htm

Ja ostatnio trochę się zajmowałem pakowaniem w Python'ie. Dzięki projektowi PyInstaller można wsadzić całego Python'a z użytymi bibliotekami i modułami w jeden plik *.exe. A pakowanie zipa jest bajecznie proste:

import zipfile
from StringIO import StringIO
zipstream=StringIO()
file_zip = zipfile.ZipFile(zipstream,"w")
file_zip.write("loader.exe","loader.exe")
file_zip.write("app_data/game.zip","app_data/game.zip")
file_zip.write("app_data/data.gz","app_data/data.gz")
file_zip.close()

zipstream.seek(0)

plik=file("gra.zip","wb")
while True:
	buf=zipstream.read(2048)
	if buf=="": break
	plik.write(buf)
plik.close()

Skopiowane z mojego projektu, cały plik zip przed zapisem jest tworzony w pamięci, dopiero potem te dane są zapisywane na dysku. Można to zrealizować prościej, ale przedstawiony sposób będzie wymagał znacznie mniej zmian, kiedy będę go przerabiał do działania w Google App Engine. Zamiast zipstream możesz od razu podać nazwę pliku i wtedy wszystko z StringIO oraz linijki po file_zip.close() można będzie usunąć.

1

Autor wątku dał jakieś bezsensowne pytanie a inni za to obrywają, masakra...

@Marcel.slip: poczytaj o NSIS, tar, zlib, 7-zip SDK.
Wymaganie żeby zrobić to samemu jest równie irracjonalne jak wykorzystywanie edytora HEX zamiast kompilatora C++.

@0DFh: nawiązując do Twojej wypowiedzi - można zbindować plik (jeden) bez czegokolwiek, wystarczy zwykłe binarne COPY...

  • program ma ciąg stałych (ASM, C/C++, Pascal) w którym masz zapisaną oryginalną długość pliku
  • uruchamiasz targetFile.exe
  • po uruchomieniu sprawdza ten ciąg i patrzy czy długość jest zerowa - jeśli tak to ją aktualizuje w pliku EXE
  • dołączasz plik dodatkowy przy użyciu COPY: copy file1.exe+file2.dat targetFile.exe
  • ten wykrywa że ma już zaktualizowaną długość i korzysta z części pliku EXE jako z danych...

@Spine: co jest złego w py2exe i PyInstaller ?

BTW: dobre fora kończą się gdy admini / moderatorzy zbyt często zaczynają wykorzystywać swoją władzę - niezależnie od przyczyny.

0

W takiej sytuacji widzę 2 sensowne wyjścia:

  • spróbować z tym WinAPI
  • użyć biblioteki w postaci kodu źródłowego lub w postaci kodu + statycznego lib'a (przy LTO nie robi to większej różnicy).

Bibliotek ci pod dostatkiem. Łap zlib'a czy coś tam innego.

0

To plik exe będzie musiał mieć statycznie linkowane biblioteki Visual'a.

A kto powiedział, że musi? Windows istniał jeszcze przed pojawieniem się pierwszego runtime Visual Studio (wersja 2003) i jakoś działał ;).
Każdy Windows ma domyślne, systemowe runtime C, które można użyć (msvcrt.dll). Lib można znaleźć w Windows Driver Kit i w dystrybucji MinGW.

Obsługa zip istnieje w Windows od wersji XP, i tak, można jej użyć. Za pomocą IShellDispatch->NameSpace można otworzyć plik zip i za pomocą Folder->CopyHere dodać do niego pliki.
Sądzę, że z małą pomocą UPX będzie można zejść do pliku o wadze ~5kb działającym na Windows XP oraz nowszych bez absolutnie żadnych zależności.

1 użytkowników online, w tym zalogowanych: 0, gości: 1