Delphi - Állományokat daraboló komponens készítése

forráskód letöltése
Készítünk egy komponenst, amely segítségével nagyobb méretű állományokat darabolhatunk fel megadott méretű, kisebb állományokra. Erre a funkcióra szükségünk lehet, ha például egy több MB méretű állományt akarunk 1.44-es lemezen elvinni. Az átmásolás után a komponens természetesen képes a darab állományokból ismét előállítani az eredeti állományt.
A mellékelt példaprogram megnyitása előtt a FileCutter.pas-ban lévő komponenst telepítenie kell a Delphi alá. Ehhez válassza a Component - Install Component menüpontot.
Ha egy állományt darabolni szeretnénk, a komponens FileName tulajdonságában kell megadnunk a darabolandó állomány nevét, a Size property-ben pedig az egyes darabok maximális méretét. Ha a DestinationDir property-ben beállítunk egy könyvtárat, és az létezik, akkor a darab állományok abba a könyvtárba kerülnek, egyébként a program könyvtárába. A darabolás Cut metódus meghívásával kezdődik.
function Cut: Word;
A függvény a létrehozott állományok számát adja visszatérési értékként.
A darab állományok neve ugyanaz, mint az eredeti állományé, kiterjesztésük pedig az adott darab indexét tartalmazza. Az első állomány indexe 1.
Ha a darab állományokat egyesíteni akarjuk, a FileName property-ben meg kell adnunk az első állományt, a DestinationDir property-t, itt is a darabolásnál leírtaknak megfelelően használhatjuk. Az összeillesztés a Unite metódus meghívásával történik meg.
function Unite: Word;
A függvény visszatérési értékként az egyesített állományok számát adja vissza.
A komponens rendelkezik egy OnProgress eseménnyel, amely darabolás és összeállítás esetén is egyaránt használható. Akkor jön létre, amikor a komponens egy újabb állományt készít el, vagy egyesít.
A komponens elkészítése
A darabolást és az egyesítést is, egyaránt TFileStream típusú objektumokkal végezzük.
Darabolás
Az eredeti állományt megnyitjuk, csak olvasásra.
fs1:=TFileStream.Create(FFileName,fmOpenRead);
Amikor létrejön az fs1 objektum, a Position értéke automatikusan a megnyitott állomány elejére mutat (0), a Size property értéke pedig felveszi az állomány méretét.
A feldolgozást addig kell végeznünk, amíg a Position értéke el nem éri a Size értékét.
while fs1.Position<fs1.Size do begin
Az adatok áthelyezését a TFileStream osztály CopyFrom metódusával végezzük el. A másolásnál meg kell adnunk a másolandó adatmennyiség hosszát.
if fs1.Size-fs1.Position<MaxSize then
  Count:=fs1.Size-fs1.Position
else
  Count:=MaxSize;
Az aktuális darab elmentéséhez szintén egy TFileStream-et használunk. Új állomány létrehozásához a Create metódusban, az fmCreate paramétert kell megadnunk.
fs2:=TFileStream.Create(Dir+FileName+'.'+IntToStr(Index),fmCreate);
fs2.CopyFrom(fs1,Count);
fs2.Free;
Egyesítés
Az előző műveletnek a visszaállítását kell elvégeznünk. Első lépésként a megadott darab állományból meg kell határoznunk az állomány eredeti nevét, és az adott elem indexét.
Ezután létrehozunk egy új állományt, az eredeti névvel.
fs1:=TFileStream.Create(DestDir+FileName,fmCreate);
Növelve az Index értékét megnyitunk minden további állományt, és tartalmát bemásoljuk az fs1-be.
        fs2:=TFileStream.Create(SourceDir+FileName+'.'+IntToStr(Index),fmOpenRead);
fs1.CopyFrom(fs2,0);
fs2.Free;
A megnyitott darab állományok méretét nem kell ismernünk. Ha a CopyFrom metódus „méret” paraméterében 0-t adunk meg, akkor az a teljes Stream tartalmát jelenti.