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 

Trocear un Fichero

 
Publicar nuevo tema   Responder al tema    Foros de discusión -> Tips & Tricks
Ver tema anterior :: Ver tema siguiente  
Autor Mensaje
Mensaje    Asunto: Trocear un Fichero Responder citando

/*
Utilidad para dividir archivos en trozos pequeños
o de archivo en trozos pequeños en archivo original

La estructura y extensión de cada archivo troceado es:
cIt El primero de la serie.
Cxx siguientes archivos xx números de 01 a 99
Estructura de cIt:
Nombre original del Archivo;Tamaño del Archivo;Cantidad de Trozos;
Nombre ArchivoTrozado01; del ArchivoTrozado01;
Nombre ArchivoTrozado02; del ArchivoTrozado02;
Nombre ArchivoTrozado03; del ArchivoTrozado03;
.
.
.
Nombre ArchivoTrozadoNN; del ArchivoTrozadoNN; //donde NN es la cant de Trozos

Estructura de Cxx:
ninguna, sólo los datos
Para unir los trozos tambien se puede desde MS-DOS:
Copy /B fichero.C01+fichero.C02+fichero.C03 fichero.Ext
------------------------------------------------------------------------------
*/

int viAccion; // variable global


void __fastcall TForm1::Trocear(char * vcArchivo,int viSizeParam)
{


bool vbNuevoTrozo = true; // Forzar a crear un archivo al principio
int viNroTrozo = 0, // Cantidad de trozos del archivo
viGrabadoActual = 0, //Bytes grabados en el trozo actual
viTotalGrabado = 0; //Total de bytes grabados
int viBytesPorBucle = viSizeParam * 1024 ; //Tamaño en bytes de cada trozo

int viCharRead;
char vcExtArchivoDestino[10],
vcArchivoCit[300],
vcNombArchivoDestino[300];
structArchivoTroceado strctInfArchTroceado[100];
FILE *pFILEOrigen,*pFILEDestino,*pFILECit;


//Extraer propieades del archivo trocear
int viHandleArchivo = open(vcArchivo,O_RDONLY);
int viTamArchivo=filelength(viHandleArchivo);
close(viHandleArchivo);
ShortDateFormat="dd/mm/yyyy";
TDateTime vDateTime = FileDateToDateTime(FileAge(vcArchivo));
char *vcFechaArchivo = FormatDateTime("dd/mm/yyyy",vDateTime).c_str();
//


pFILEOrigen=fopen(vcArchivo,"rb");
do // mientras (viTotalGrabado < viRestoBufferPorLeer)
{
if (vbNuevoTrozo)
{
viNroTrozo ++;
sprintf(vcExtArchivoDestino, ".C%s",StrFormat(IntToStr(viNroTrozo).c_str(),'D',2,'0'));
sprintf(vcNombArchivoDestino,"%s%s",vcArchivo,vcExtArchivoDestino);
//Si ya existe ese fichero, borrarlo ya que si el anterior es más grande que el del
//trozo actual, se quedará lo que hubiese antes a partir de ese trozo...
DeleteFile(vcNombArchivoDestino);
//Informacion del trozo a crear
strcpy(strctInfArchTroceado[viNroTrozo-1].vcNombre,vcNombArchivoDestino);
pFILEDestino=fopen(vcNombArchivoDestino,"wb");
vbNuevoTrozo = false;
}
else
{
// Leer 1024 bytes o el resto... (ahora BytesPorBucle)
viGrabadoActual = viTamArchivo - viTotalGrabado;
if (viGrabadoActual >= viBytesPorBucle)
viGrabadoActual = viBytesPorBucle;
viTotalGrabado += viGrabadoActual;
int viTmp=0;
while (viTmp<viGrabadoActual)
{
viCharRead=fgetc(pFILEOrigen);
fputc(viCharRead,pFILEDestino);
viTmp++;
}
strctInfArchTroceado[viNroTrozo-1].viSize=viGrabadoActual;
fclose( pFILEDestino);
vbNuevoTrozo = true;
}

} while (viTotalGrabado < viTamArchivo);
fclose(pFILEOrigen);
fclose(pFILEDestino);

// guardar cabecera
char pcLine[350];
sprintf(vcArchivoCit,"%s.Cit",vcArchivo);
pFILECit=fopen(vcArchivoCit,"wb");
sprintf(pcLine,"%s;%d;%d;%s;\r\n",vcArchivo,viTamArchivo,viNroTrozo,vcFechaArchivo);
fprintf(pFILECit,pcLine);
for ( int i=0;i<viNroTrozo ; i++)
{
pcLine[0]=0;
sprintf(pcLine,"%s;%d;\r\n",strctInfArchTroceado[i].vcNombre,strctInfArchTroceado[i].viSize);
fprintf(pFILECit,pcLine);
}
fclose(pFILECit);

ShowMessage("Fin de SplitTws ...");

}
//---------------------------------------------------------------------------
void __fastcall TForm1::Unir(char * vcArchivo)
{

int viNroTrozo = 0; // Cantidad de trozos del archivo
int viCharRead;
char vcArchivoCit[300];
structArchivoTroceado strctInfArchTroceado[100];
FILE *pFILEOrigen,*pFILEDestino,*pFILECit;

//extraer cabecera, lee valores de Archivo.Cit
char pcLine[350];
sprintf(vcArchivoCit,"%s.Cit",Copy(vcArchivo,0,strlen(vcArchivo)-5));
pFILECit=fopen(vcArchivoCit,"rb");
fgets(pcLine,350,pFILECit);
int viTamArchivo = StrToInt(FieldSeparatedByChar(2,pcLine,';'));
viNroTrozo = StrToInt(FieldSeparatedByChar(3,pcLine,';'));
DeleteFile(Copy(vcArchivo,0,strlen(vcArchivo)-5));
pFILEDestino=fopen(Copy(vcArchivo,0,strlen(vcArchivo)-5),"wb");
int viTmp=0;
for ( int i=0;i<viNroTrozo ; i++)
{
fgets(pcLine,350,pFILECit);
strcpy(strctInfArchTroceado[i].vcNombre,FieldSeparatedByChar(1,pcLine,';'));
strctInfArchTroceado[i].viSize=StrToInt(FieldSeparatedByChar(2,pcLine,';'));
pFILEOrigen=fopen(strctInfArchTroceado[i].vcNombre,"rb");
viTmp=0;
while (viTmp<strctInfArchTroceado[i].viSize)
{
viCharRead=fgetc(pFILEOrigen);
fputc(viCharRead,pFILEDestino);
viTmp++;
}
fclose(pFILEOrigen);
}
fclose(pFILEDestino);fclose(pFILECit);
//
ShowMessage("Fin de JoinTws ...");

}
//---------------------------------------------------------------------------
_________________
Tino
Volver arriba
Ver perfil de usuario Enviar mensaje privado Enviar email
Mensaje    Asunto: Responder citando

Hola, puedes poner las librerias que usas? lo digo porque me da error al compilar y porque por ejemplo FILE necesita stdio.h, plz
Volver arriba
Ver perfil de usuario Enviar mensaje privado
Mensaje    Asunto: Responder citando

me da muchos errores que dicen "illegal character" y tmb me dice "TForm1::Trocar(char *,int)' is not a member of 'TForm'
" Sad
Volver arriba
Ver perfil de usuario Enviar mensaje privado
Mensaje    Asunto: Partir archivos Responder citando

Hola maxpowel,

La verdad es que todavia no probe el código que pone Tino, pero aqui te van algunos concejos que espero te sirvan, lo primero del error que dice:
Cita:
"TForm1::Trocear(char *, int) is not member of TForm"

Pues este error sale cuando declaras alguna funcion que no le pertenece a la clase para esto solo tienes que incluirlo en el archivo.h (archivo de cabecera), puedes hacer clic derecho en la pestaña de la unidad cpp por ejemplo "Unit1.cpp", de las opciones elegir "Open Source header file", o algo parecido luego buscas la parte que dice published, y ahi lo declaras para este caso lo puedes hacer de las siguientes maneras:
Código:
published:
          void __fastcall Trocear(char * vcArchivo,int viSizeParam);

o
Código:
published:
          void __fastcall Trocear(char *,int);

en el primer caso especificas el nombre de las variables mas su tipo, en el segundo ejemplo solo haces referencia al tipo de datos que recibira la funcion, en cuanto a las librerias lo que puedes hacer es, en el caso de que esten bien escritas pues te colocas bajo la palabra y presionas Ctrl + F1, esto te lleva directamente a la ayuda de la palabra en cuestion, y generalmente en esta ayuda te sale la(s) libreria(s) que se necesita(n), bueno espero haberte ayudado....

Tu amigo Raúl
Volver arriba
Ver perfil de usuario Enviar mensaje privado Enviar email Visitar sitio web del autor Yahoo Messenger 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.