CXI-Basis-Programmierreferenz / Version 2 / Datenspeicherung / CxiTree / Zusatzfunktionen /
CxiError CxiTree :: ReorganizeTo (const char *target, const char *keyword, short options)
CxiError cxiReorganize (CxiHandle self, const char *target, const char *keyword, short options)
Schreibt einen kompletten Teilbaum als CxiTreeFile-Datei
target:
Name der Zieldatei
keyword:
Schlüsselwort für Zieldatei, 0 für unverschlüsselte Datei
options:
Optionen: 0 für Standarddatei, cxiOptPacked für gepackte Datei
return:
0 ok, sonst Fehler
ReorganizeTo arbeitet ähnlich wie CopySubTree, jedoch wird als Ziel eine Datei erstellt. Diese Datei enthält keine verlorenen Bereiche. Solche Bereiche entstehen, wenn ein Knoten seine ursprüngliche Größe überschreitet, so dass er innerhalb der Datei verschoben werden muss. Wird cxiOptPacked angegeben, folgen alle Knoten direkt ohne Reservebytes aufeinander; andernfalls werden alle Größen auf ein Vielfaches der Blockgröße (meistens 256 Byte) aufgerundet. cxiOptPacked sollte nur verwendet werden, wenn die erstellte Datei nur zum Lesen vorgesehen ist.
Portabilität:
Diese Funktion ist in allen unterstützten Systemen verfügbar.
Siehe auch:
CopySubTree...
Beispiel:
// *** Datei CXIREORG.CPP ***
// CXIREORG benutzt die Funktion ReorganizeTo, um eine
// CXI-Datei zu reorganisieren. Dabei kann die Quelldatei
// uncodiert sein (Parameter <keyword> nicht angegeben)
// oder eine verschlüsselte Datei sein (Parameter
// <keyword> muß angegeben werden).
// Durch Hinzufügen von /C wird die Quelldatei uncodiert
// gelesen und die Zieldatei codiert erstellt.
// Mit /P wird eine gepackte Zieldatei erstellt.
// Dieses Beispielprogramm ist als CXIREORG.EXE allgemein
// verfügbar.
#include <stdio.h>
#include "cxi.h"
#define CXIREORGVERSION "2.04"
static int usage (void)
{
printf ("\nUsage: CXIREORG <sourcefile> <targetfile>"
" [\"<keyword>\"] [/P] [/C]\n");
return 1;
}
int main (int argc, char **argv)
{
const char *source = 0;
const char *target = 0;
const char *kword = 0;
int rpw = 1;
CxiError rc;
CxiShort options = 0;
int i;
printf ("\nCXIREORG - CXI File Reorganizer - Version "
CXIREORGVERSION "\n");
// Parameter auswerten
for (i=1; i<argc; i++)
{
const char *argvi = argv [i];
if (*argvi == '/' || *argvi == '-')
{
// Option
argvi++;
switch (*argvi & 0xDF)
{
case 'P': // /P Pack (für Readonly-Datei)
options |= cxiOptPacked;
break;
case 'C': // /C Crypt
rpw = 0;
break;
default:
return usage ();
}
}
else if (!source) // Dateiname 1
source = argvi;
else if (!target) // Dateiname 2
target = argvi;
else if (!kword) // Schlüssel
kword = argvi;
else
return usage ();
}
// Parameterüberprüfung
if (source == 0 || target == 0)
return usage ();
// Quelldatei öffnen
CxiTreeFile rf (source,
cxiOptReadOnly | cxiOptNoCreate | cxiOptShadowBuffer,
rpw ? kword : 0);
if (rf.Status())
{
printf ("\n%s(%d) opening source file \"%s\"\n",
cxiQueryErrorName (rf.Status()),
rf.Status(), source);
return 2;
}
rf.EnableFileCache (16);
// Reorganisation durchführen
printf ("\nReorganizing \"%s\"", source);
printf (" to \"%s\"\n", target);
rc = rf.ReorganizeTo (target, kword, options);
if (rc)
{
printf ("\n%s(%d) during reorganization\n",
cxiQueryErrorName (rc), rc);
return 3;
}
// Fertig
printf ("\nSuccess.\n");
return 0;
}
// *** Ende CXIREORG.CPP ***