|
|
Összecsomagolt állományok kibontása
Állomány csomagoló 2. rész
|
|
Példaprogram letöltése
8775 bájt
|
Előző számunkban bemutattunk egy olyan komponenst, amely fájlokat képes összemásolni egyetlen fájlba. Most elkészítjük azt a komponenst, amely képes az így összemásolt fájlokat kicsomagolni.
A mellékelt példaprogram megnyitása előtt az UnpackFiles.pas-ban lévő komponenst telepítenie kell a Delphi alá.
Maga a komponens sokkal egyszerűbb az összemásoló komponensnél. Mindössze két property-je van, és egy Execute függvénye.
A FileName property-ben kell megadnunk az összepakolt fájl nevét, míg a DestinationFolder property-ben azt a könyvtárat, ahová a fájlokat ki szeretnénk csomagolni.
Az Execute függvény meghívásával kezdődik a fájlok kicsomagolása:
function Execute:integer;
A függvény visszatérési értéke 0, ha a művelet sikerült, ellenkező esetben a hibakód, amit a PFERROR kezdetű konstansokkal lehet azonosítani.
Első lépésben ellenőrizzük, hogy a kicsomagolandó fájl egyáltalán létezik-e. Ha nem létezik, akkor PFERROR_FILE_NOT_FOUND hibakóddal kilépünk a függvényből.
if NOT FileExists(FFileName) then begin
result:=PFERROR_FILE_NOT_FOUND;
Exit;
end;
Ha a fájl létezik, akkor ellenőrizzük a célkönyvtárat is. Ha nem létezik megpróbáljuk létrehozni, és ha ez sem sikerült, akkor PFERROR_PATH_NOT_FOUND hibakóddal kilépünk.
if NOT ForceDirectories(FDestinationFolder) then begin
result:=PFERROR_PATH_NOT_FOUND;
Exit;
end;
Ha minden rendben, akkor megpróbáljuk megnyitni a fájlt. A fájlműveletekhez hasonlóan az összepakolásnál itt is a TFileStream osztályt használjuk. Ha a fájlt nem sikerül megnyitni, akkor egy PFERROR_CANT_OPEN_FILE hibaüzenettel kilépünk.
try
fsource:=TFileStream.Create(FFileName, fmOpenRead);
except
result:=PFERROR_CANT_OPEN_FILE;
Exit;
end;
Ha megnyitottuk a fájlt, akkor beolvassuk a Header rekordba (TPackedFileHeader) az adatokat. Ez a rekord tartalmazza a fájl azonosítóját, verziószámát, és a fejléc rekord méretét. A rekord beolvasása után ellenőrizzük a fájl azonosítót és a verziószámot. Ha a fájl azonosító nem egyezik meg a PFFILEID konstansban tárolt azonosítóval, akkor egy PFERROR_BAD_FILE_ID hibakóddal kilépünk. Természetesen előtte lezárjuk a fájlt.
fsource.Read(Header, SizeOf(Header));
if Header.ID<>PFFILEID then begin
result:=PFERROR_BAD_FILE_ID;
fsource.Free;
Exit;
end;
Ha a fájl verziószáma későbbi, mint a komponensünkben tárolt verziószám (PFVERSION konstans), akkor lezárjuk a fájlt és egy PFERROR_NEWER_VERSION hibakóddal kilépünk. Erre azért van szükség, mert nem tudhatjuk előre, hogy az újabb fejlesztésekben milyen változtatások történnek.
if Header.Version>PFVERSION then begin
result:=PFERROR_NEWER_VERSION;
fsource.Free;
Exit;
end;
Ha minden rendben van, akkor beolvassuk a fájl fejlécét az Info (TPackedFileInfo) rekordba, és elkezdjük a fájlokat sorban beolvasni.
fsource.Read(Info, Header.InfoSize);
t:=0;
while t<Info.NumberOfFiles do
begin
Beolvassuk a fájl nevét, pozícióját és méretét tartalmazó rekordot, majd a pos változóban eltároljuk a jelenlegi pozíciónkat a fájlban, ami a következő fájl adatait tartalmazó rekord kezdő pozíciója. Rápozícionálunk a becsomagolt fájlra, beolvassuk, majd elmentjük azt. Az eredeti fájlnévből töröljük az eredeti elérési útvonalat, és újnak a DestinationFolder property-ben megadott útvonalat adjuk meg.
fsource.Read(FileInfo, SizeOf(FileInfo));
pos:=fsource.Position;
fsource.Position:=Info.StartPosition+FileInfo.FilePosition;
dfname:=FDestinationFolder+ExtractFileName(FileInfo.FileName);
try
fdestination:=TFileStream.Create(dfname, fmCreate);
fdestination.CopyFrom(fsource, FileInfo.FileSize);
fdestination.Free;
except
end;
Miután elmentettük a fájlt, visszapozícionálunk a következő fájl adatait tartalmazó rekordra. Ezt a pozíciót előzőleg a pos változóban tároltuk el. Ezt egészen addig folytatjuk, amíg az összes fájlt ki nem másoltuk.
fsource.Position:=pos;
inc(t);
end;
fsource.Free;
result:=0;
|
Könyv
Ez a cikk megtalálható ebben a könyvben:
Delphi Software Offline 2001 évkönyv 283. oldal
Felhasználási feltételek
A Software Online szoftverfejlesztői magazin mindegyik cikke, minden megjelent képe, és egyéb publikált anyaga szerzői jog védelme alatt áll! Bármilyen formában történő másodlagos terjesztésük, közzétételük vagy felhasználásuk kizárólag a kiadó előzetes írásbeli engedélyével történhet!
|