12 nov 2011

Divisor de archivos [C/C++]

Divisor de archivos [C/C++]


Pues estuve siguiendo con C++ y me encontre con una función muy interesante en fstream, que es la posibilidad de hacer una especie de "divisor de archivos" metí la posibilidad de darle otra extensión al archivo dividido.

Pongo el code y lo explico luego:


#include <iostream>
#include <fstream>
#include <windows.h> //usalo si vas  a usar el GetFileAtributes
using namespace std;
char FileName[MAX_PATH] = "",ext[5] = "",archivo2[] = "",bytes[20][10000000];
int Num,tam,posicionmemoria = 0,sizeyadividido;
int main(void)
{
cout << "\nEscribe un archivo existente: ";
    cin.getline(FileName, MAX_PATH);
    if(GetFileAttributes(FileName) ==  0xFFFFFFFF)
    {
    cout << "\nArchivo erroneo";
    cin.get();
    return 0;
    }
    cout << "\nEscribe una extension: ";
    cin.getline(ext, MAX_PATH);
    cout << "\nSeparaciones(+2): ";
    cin >> Num;
if(Num < 2)
{
cout << "\nError,no se puede separar el archivo en "<<Num<<"parte/s";
cin.get();
return 0;
}



ifstream IFile(FileName, ios::binary);
IFile.seekg(0, ios::end);
tam = IFile.tellg();
sizeyadividido = tam / Num;
IFile.seekg(0, ios::beg);
for(int i = 0; i< Num; i++)
IFile.read(bytes[i], sizeyadividido);
IFile.close();
for(int i = 0; i < Num; i++)
{
sprintf(archivo2, "%d_%s.%s", i, FileName, ext);
ofstream OFile(archivo2, ios::binary);
OFile.write(bytes[i], sizeyadividido);
OFile.close();
}
cout << "\n"<< FileName << " se dividio en  " << Num << " archivos";
cin.get();
return EXIT_SUCCESS;
}

Primero declaramos todas las variables, librerías y demás.
Ponemos el nombre y extensión de un archivo que este EN EL MISMO LUGAR que nuestro ejecutable.

Entonces tenemos la función GetFileAtributes que nos dice si existe o no y si tiene los atributos suficientes para poder dividirlo.


¿Por qué 0xFFFFFFFF?

Porque si la función falla el valor de retorno es 0xFFFFFFFF o INVALID_FILE_ATTRIBUTES cosa que nos permite saber lo anteriormente comentado.

Luego se le implementa la extensión y el numero de partes,(lógicamente tiene que ser mayor de dos)

Y luego ya empieza el codigo verdadero comienza a leer los bytes del archivo y divide su tamaño por las partes que hemos pedido y con eso le damos el valor a sizeyadividido que en realidad serian los bytes por parte.

Llega el primer for con el que se lee todo el code y en el segundo se escribe todo(extensión, nombre,  contenido, bytes) hasta for(int i = 0; i < Num; i++) sencillo,¿no?

No hay comentarios:

Publicar un comentario