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


Registrado: 29 Oct 2002Mensajes: 4Ubicación: PERU
|
Publicado: Mar 17 Dic, 2002 8:53 pm Asunto: Trocear un Fichero |
|
|
/*
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 |
|
 |
maxpowel Cdt

Registrado: 01 Abr 2005Mensajes: 18
|
Publicado: Lun 30 May, 2005 5:22 pm Asunto: |
|
|
| 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 |
|
 |
maxpowel Cdt

Registrado: 01 Abr 2005Mensajes: 18
|
Publicado: Vie 10 Jun, 2005 3:16 pm Asunto: |
|
|
me da muchos errores que dicen "illegal character" y tmb me dice "TForm1::Trocar(char *,int)' is not a member of 'TForm'
"  |
|
| Volver arriba |
|
 |
Raúl Capt


Registrado: 16 Ago 2002Mensajes: 174Ubicación: Oruro (Bolivia)
|
Publicado: Mar 21 Jun, 2005 1:52 am Asunto: Partir archivos |
|
|
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 |
|
 |
|
|
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.
|