Club Builder - Foros de discusión Club Builder
Foro de C++Builder en español
 
 FAQFAQ   BuscarBuscar   MiembrosMiembros   Grupos de UsuariosGrupos de Usuarios   RegistrarseRegistrarse 
 PerfilPerfil   Entra para ver tus mensajes privadosEntra para ver tus mensajes privados   EntrarEntrar 

Clase para crear puntos de restauracion....

 
Publicar nuevo tema   Responder al tema    Foros de discusión -> Tips & Tricks
Ver tema anterior :: Ver tema siguiente  
Autor Mensaje
Mensaje    Asunto: Clase para crear puntos de restauracion.... Responder citando

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...Sad ). 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 Very Happy
Volver arriba
Ver perfil de usuario Enviar mensaje privado MSN Messenger
Mensaje    Asunto: Error... Responder citando

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.... Confused
Volver arriba
Ver perfil de usuario Enviar mensaje privado MSN Messenger
Mostrar mensajes de anteriores:   
Cambiar a:  
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


Hosting WordPress Indedmedia desde 3,99 €
© 2002–2026 Club Builder · Funciona con phpBB.