 |
Club Builder Foro de C++Builder en español
|
| Ver tema anterior :: Ver tema siguiente |
| Autor |
Mensaje |
TG_Cid Cdt

Registrado: 15 Ene 2008Mensajes: 5Ubicación: Mexico
|
Publicado: Mar 12 Feb, 2008 6:32 am Asunto: Clase para crear puntos de restauracion.... |
|
|
Hola, soy nuevo en este foro como podran ver, todavia soy estudiante por lo que he visto en varios posts que me han interesado algunos de ustedes ya programan profesionalmente, yo todavia no estoy a ese nivel espero en algunos años llegar a ese nivel...
Y pues bueno despues de una breve introduccion de mi persona les comento de que va esta clase; en varios sistemas que he desarrollado he querido tener la opcion de poder crear puntos de restauracion para salvar toda la informacion del sistema y poder recuperarla despues, y pues bueno por cuestiones de tiempo o por darle mas importancia a otros aspectos de los sistemas no tuve el tiempo para hacerlo, ahora estoy desarrollando un sistema para manejar una caja de ahorro y pues esta vez si tengo un poco mas tiempo y pude hacer esta clase para poder hacer puntos de restauracion y restauraciones del sistema.
Esta clase maneja una lista de archivos, una ruta y un indice(la lista de archivos se maneja como una pila para agregar o quitar archivos de la lista), se define la ruta en donde estaran los archivos y se agregan los nombres de los archivos, y pues lo unico que hace es que cuando se llama el metodo para crear un punto de restauracion, crea una cabecera con informacion de los archivos en la lista, lee lo que en cada archivo y lo mete en un archivo unico(es sencillo, quiero decir que no encripta ni comprime... ). El archivo que tiene toda la informacion se crea en la carpeta donde esta el ejecutable(a menos que le especifiques la ruta en el nombre del archivo) y cuando llamas al metodo para restaurar(le das el nombre del archivo del cual se restaurara, igual que el metodo de crear punto de restauracion) te crea los archivos en la ruta que tenga almacenada.
| Código: |
# include <stdio>
# include <string>
# include <iostream>
# include <conio>
////////////////////////////////////////////////////////////////////////////////
const int FileNameSize = 50;//FileNameSize = 50;
const int PathSize = 200;//PathSize = 200;
class PRArchivos
{
private:
char Path[PathSize];
char Files[FileNameSize][FileNameSize];
int index;
bool Crear_Cabecera(char *Nom_Arc_Rest, long Tam_Arc[FileNameSize]);
int Leer_Cabecera(char *Nom_Arc, int TamCad[FileNameSize], long TamArc[FileNameSize], char Archivos[FileNameSize][FileNameSize], int Num_Arc[2]);
public:
PRArchivos();
void Definir_Ruta(char *Ruta);
void Agregar(char *Archivo);
bool Crear_Punto_Restauracion(char* Npunto);
bool Restaurar(char* Npunto);
void Borrar_Ultimo_Agregado();
};
////////////////////////////////////////////////////////////////////////////////
PRArchivos :: PRArchivos()
{
index = 0;
Path[0] = 0;
}
////////////////////////////////////////////////////////////////////////////////
void PRArchivos :: Definir_Ruta(char *Ruta)
{
strcpy(Path, Ruta);
}
////////////////////////////////////////////////////////////////////////////////
void PRArchivos :: Agregar(char *Archivo)
{
strcpy(Files[index], Archivo);
index++;
}
////////////////////////////////////////////////////////////////////////////////
bool PRArchivos :: Crear_Cabecera(char *Nom_Arc_Rest, long Tam_Arc[FileNameSize])
{
int tam2[FileNameSize], x, ind[2];
FILE* escritor;
ind[0] = index;
if(escritor = fopen(Nom_Arc_Rest, "wb"))
{
fwrite(ind, sizeof(int), 1, escritor);
for(x = 0; x < index; x++)
tam2[x] = strlen(Files[x]);
fwrite(tam2, sizeof(int)*ind[0], 1, escritor);
fwrite(Tam_Arc, sizeof(long)*ind[0], 1, escritor);
for(x = 0; x < index; x++)
fwrite(Files[x], tam2[x], 1, escritor);
fclose(escritor);
return true;
}
return false;
}
////////////////////////////////////////////////////////////////////////////////
int PRArchivos :: Leer_Cabecera(char *Nom_Arc, int TamCad[FileNameSize], long TamArc[FileNameSize], char Archivos[FileNameSize][FileNameSize], int Num_Arc[2])
{
FILE *lector;
int x, posicion;
if(lector = fopen(Nom_Arc, "rb"))
{
fread(Num_Arc, sizeof(int), 1, lector);
fread(TamCad, sizeof(int)*Num_Arc[0],1,lector);
fread(TamArc, sizeof(long)*Num_Arc[0], 1, lector);
for(x = 0; x <Num_Arc> 0)
{
for(cnt = 0; cnt < index; cnt++)
{
//unir la ruta con el nombre del archivo
strcpy(file, Path);
strcat(file, "//");
strcat(file, Files[cnt]);
//Determinar los tamaños de los archivos
if(lector = fopen(file, "rb"))
{
fseek(lector, 0, SEEK_END);
Tam[cnt] = ftell(lector);
fseek(lector, 0, SEEK_SET);
fclose(lector);
}
else
{
fclose(lector);
return false;
}
}
//Escribir cabecera del archivo
if(Crear_Cabecera(Npunto, Tam))
{
//escribir el contenido de los archivos en un solo archivo
escritor = fopen(Npunto, "ab");
//iniciar el indice de pot2
indice = 12;
for(cnt = 0; cnt <index> 0)
{
//encontrar el tamaño mas "apropiado" para la escritura
while(Tam[cnt] <Pot2>= Pot2[indice])
{
fread(buffer,Pot2[indice],1,lector);
fwrite(buffer,Pot2[indice],1,escritor);
Tam[cnt] -= Pot2[indice];
}
}
indice = 12;
fclose(lector);
}
fclose(escritor);
}
else
{
return false;
}
}
return false;
}
////////////////////////////////////////////////////////////////////////////////
bool PRArchivos :: Restaurar(char* Npunto)
{
int TamCad[FileNameSize], NArc[2], cnt, pos, indice = 12;
long TamArc[FileNameSize];
char Arcs[FileNameSize][FileNameSize], FileandPath[FileNameSize+PathSize];
int Pot2[] = {1, 2, 4, 8, 16, 32, 64, 128, 256, 512, 1024, 2048, 4096};//13 valores
unsigned char buffer[4096];
FILE *lector, *escritor;
pos = Leer_Cabecera(Npunto, TamCad, TamArc, Arcs, NArc);
lector = fopen(Npunto, "rb");
fseek(lector, pos, SEEK_SET);
for(cnt = 0; cnt <NArc> 0)
{
strcpy(FileandPath, Path);
strcat(FileandPath, "//");
}
strcat(FileandPath, Arcs[cnt]);
escritor = fopen(FileandPath, "wb");
while(TamArc[cnt] > 0)
{
//encontrar el tamaño mas "apropiado" para la lectura/escritura
while(TamArc[cnt] <Pot2>= Pot2[indice])
{
fread(buffer,Pot2[indice],1,lector);
fwrite(buffer,Pot2[indice],1,escritor);
TamArc[cnt] -= Pot2[indice];
}
}
indice = 12;
fclose(escritor);
}
fclose(lector);
}
////////////////////////////////////////////////////////////////////////////////
void PRArchivos :: Borrar_Ultimo_Agregado()
{
if(index > 0)
index--;
}
////////////////////////////////////////////////////////////////////////////////
void main()
{
PRArchivos Restore;
char name[FileNameSize], tmp[FileNameSize+PathSize], dir[PathSize];
int h, j;
cout << "cuantos archivos?\n";
cin >> h;
cout << "direccion de archivos:\n";
gets(dir);
Restore.Definir_Ruta(dir);
while(h > 0)
{
cout << "nombre de archivo:\n";
gets(name);
Restore.Agregar(name);
h--;
}
cout << "nombre del archivo de restauracion:\n";
gets(tmp);
Restore.Crear_Punto_Restauracion(tmp);
getch();
Restore.Definir_Ruta("C:");
Restore.Restaurar(tmp);
}
|
Por ultimo le deje el main con el que le estuve haciendo pruebas, este te pida la ruta y el nombre de algunos archivos y los guarda en un solo archivo que se crea en la carpeta donde este el ejecutable despues redifine la ruta y restaura los archivos en la raiz ( C: ).
Espero les sirva y les ahorro un buen rato de programacion  |
|
| Volver arriba |
|
 |
TG_Cid Cdt

Registrado: 15 Ene 2008Mensajes: 5Ubicación: Mexico
|
Publicado: Mar 18 Mar, 2008 12:57 am Asunto: Error... |
|
|
Una disculpa, alguien me pregunto algo sobre si el codigo hacia cierta cosa y pues le respondi pero como tiene algo de tiempo que lo hice me puse a checar mi codigo para recordar y me di cuenta de que esta bastante mal el codigo que esta publicado en el foro, lo mas raro es que lo unico que hice fue un copy-paste para ponerlo aqui en el foro. Ya me habia ocurrido una vez anterior en otro post que si ponia codigo con copy-paste me ponia algo con errores... a lo mejor solo soy yo e hice mal la pegada o el copiado...
Pero bueno mejor subi el cpp al rapidshare:
http://rapidshare.com/files/100345430/Restauracion.rar
Por cierto, no lei todo el codigo pero por lo menos hay un error grandisimo en el metodo de Leer_Cabecera, quien sabe como pero a partir de cierto punto se pone a escribir quien sabe que, si su unico proposito es Leer la cabecera del archivo de restauracion....  |
|
| Volver arriba |
|
 |
|
|
No puedes publicar temas nuevos en este foro No puedes responder a temas en este foro No puedes editar tus mensajes en este foro No puedes borrar tus mensajes en este foro No puedes votar en las encuestas de este foro
|
© 2002–2026 Club Builder · Funciona con phpBB.
|