HyperLink
Bejelentkezés
E-mail: 
Jelszó: 





Skip Navigation Links
 

Ö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;

Cikksorozat

#IDKategóriaCikk címeSorozat
3333WindowsNet Shell parancsok1. rész
3367WindowsNet Shell parancsok2. rész
3396WindowsNet Shell parancsok3. rész


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!

Copyright © 1999-2012 Animare Software Kft. Minden jog fenntartva!
| Készült: Animare Stúdió | Adatvédelem | Kapcsolat |