Foros Club Delphi

Foros Club Delphi (https://www.clubdelphi.com/foros/index.php)
-   Varios (https://www.clubdelphi.com/foros/forumdisplay.php?f=11)
-   -   Creación de tipos de archivo (https://www.clubdelphi.com/foros/showthread.php?t=74895)

Tortuguica 16-07-2011 11:40:26

Creación de tipos de archivo
 
Hola a todos: En primer lugar, quiero pedir disculpas por si no estoy en el foro correcto. Y en segundo lugar, os explico cuál es mi problema: me gustaría compactar tres archivos (txt, rtf, ini) en un único archivo, con una extensión nueva, y, después, poder acceder a los archivos que contiene, claro. ¿Puede alguien darme una idea de por dónde empezar? He buscado en Google y no he encontrado nada. Gracias por adelantado.

Tortuguica 16-07-2011 11:42:01

Aclaración
 
Bueno, antes he olvidado preguntar si es posible hacer eso. Gracias de nuevo.

Casimiro Noteví 16-07-2011 11:53:00

Puedes comprimirlo en un zip y extraerlo cuando lo vayas a necesitar, supongo que será eso lo que quieres, ¿no?

ecfisa 16-07-2011 12:58:31

Hola Tortuguica.

Si lo creo posible.

Es sencillo concatenar los tres archivos en un único archivo si se convierten todos a formato texto por ejemplo. Lo que se complica es la recuperación en el formato adecuado.
Los archivos .txt e .ini podrías leerlos y trabajar directamente de archivo a memoria, pero con el .rtf tendrías que guardarlo en un archivo temporal para luego cargarlo con un RichEdit por ejemplo.

Supongamos que el orden de agrupación es: .txt + .ini + .rtf
Conociéndo con antelación la longitud en bytes (caracteres) de cada uno sería cosa de leer los N caracteres del txt, los N del .ini y los restantes corresponderán al .rtf

Pero no sé si es eso lo que buscas hacer...:rolleyes:

Saludos.

escafandra 16-07-2011 13:53:15

Basta con escribir una cabecera delante de cada archivo. Luego se escriben todos uno detrás de otro precedidos de su cabecera.
Su cabecera puede ser una estructura que contenga el tamaño de la misma, nombre del archivo y su longitud.

Con esta estructura se pueden extraer los archivos uno detrás de otro sin importar el orden, tamaño, tipo ni número de los mismos.;)


Saludos.

ecfisa 16-07-2011 15:59:58

Hola escafandra.

Yo había pensado en eso, es más había probado este código y funciona bién:
Código Delphi [-]
function FileLength(const NomArch:String): DWord;
var
  Hndw: integer;
begin
  Hndw:= FileOpen(NomArch, 0);
  try
    Result:= (GetFileSize(Hndw, nil));
  finally
    FileClose(Hndw);
  end;
end;

procedure Concatenar(const FileNames: array of string);
var
  i: Integer;
  Ori, Des: TextFile;
  s: string;
  Len: DWord;
begin
  AssignFile(Des,'C:\TODOS.TXT');
  Rewrite(Des);
  for i:=  High(FileNames) downto Low(FileNames) do
  begin
    Len:= FileLength(FileNames[i]);
    AssignFile(Ori, FileNames[i]);
    Reset(Ori);
    Writeln(Des,FileNames[i]+':'+IntToStr(Len));
    while not eof(Ori) do
    begin
      ReadLn(Ori,s);
      Writeln(Des,s);
    end;
    Flush(Des);
    CloseFile(Ori);
  end;
  CloseFile(Des);
end;
Pero luego me puse a pensar, ¿ Como encuentro despues la cabecera si un archivo contiene el identificador que uso para distinguirla ?
Es decir como hacer para usar un identificador que sea diferente a cualquier combinación de caracteres posibles dentro de un archivo.
Por eso luego pensé en obtener previamente el tamaño en bytes.

¿ Se te ocurre algún modo ? Por que de esa forma es muchísimo más simple.

Un saludo.

Tortuguica 16-07-2011 16:37:19

Gracias a todos
 
Pues muchas gracias a todos. ¡Qué máquinas sois! :-) Un saludo.

escafandra 16-07-2011 17:24:42

Cita:

Empezado por ecfisa (Mensaje 406593)
Hola escafandra.
.....
¿ Se te ocurre algún modo ? Por que de esa forma es muchísimo más simple.

Si, La cabecera debe empezar con un WORD que contiene el tamaño de la misma. Inmediatamente un DWORD que contiene el tamaño del archivo y seguidamente un array de CHAR que contiene el nombre. Detras viene el archivo binario. Esto se repita por cada archivo.

Para recuperarlo leemos le primer WORD (2 Bytes) y tras elle leemos la cantidad de Bytes del resto de esa cabecera. El primer DWORD (4 Bytes) sabemos que es el tamaño del archivo, Sabemos la longitud del FileName restando el tamaño de la cabecera menos 6. Ya solo queda leer el archivo cuyo tamaño conocemos... Repetimos...

Si el tamaño de algún archivo es mayor de 4Gb podemos guardarlo en in int64 en vez de en un DWORD.
Podemos simplificarlo algo si reservamos un espacio fijo en la cabecera para el nombre de archivo, en ese caso sobra guardar el tamaño de la cabecera pues siempre será el mismo y conocido. Pero si queremos guardar el Path entero este ultimo sistema desaprovecha espacio.

No tengo un delphi a mano, no puedo realizar un ejemplo, pero deciros que algo similar ya implementé en C hace tiempo.

Saludos.


PD me voy de vacaciones y no podré seguir el hilo...

ecfisa 16-07-2011 17:48:48

Cita:

Empezado por escafandra (Mensaje 406602)
Si, La cabecera debe empezar con un WORD que contiene el tamaño de la misma. Inmediatamente un DWORD que contiene el tamaño del archivo y seguidamente un array de CHAR que contiene el nombre. Detras viene el archivo binario. Esto se repita por cada archivo.

Hola.

Buenisimo, no se me había ocurrido...

Gracias y que disfrutes el descanso. :)

Tortuguica 16-07-2011 21:29:46

Gracias, escafandra y ecfisa. Perdón por mi escueto agradecimiento de antes, pero venía de la playa y estaba rendido :-/ Voy a ver cómo me sale la propuesta de escafandra. Un saludo a los dos.

Tortuguica 16-07-2011 21:33:42

Ah, y gracias también a ti, Casimiro Notevi, claro (la playa me ha matao la buena educación). Pero lo que estaba buscando es lo que han sugerido escafandra y ecfisa. Más saludos para todos.

Casimiro Noteví 16-07-2011 22:19:52

Ya nos contarás :)

Tortuguica 17-07-2011 00:04:54

Ya os puedo contar: al final, no lo he hecho como decíais... porque no tengo muy claro lo de la escritura y lectura de archivos binarios :-( Pero, y esta es la parte positiva, me habéis dado una idea. Ahora lo guardo todo en un archivo con la longitud de cada parte (rtf, txt, ini) al principio de cada una de ellas. Después recupero cada parte, la transformo en un archivo temporal conveniente, lo utilizo y me lo cargo. Es un poco primario, pero eficiente. Prometo estudiar un poco más de Delphi para no tener que volver a recurrir a cutreríos como el que he hecho. Gracias de nuevo a todos por vuestro interés. Un saludo.

fide_uci 17-07-2011 05:28:27

Yo mejor utilizaria por ejemplo algo como ZipForge. Usando este componente creo un Zip, meto cada uno de los archivos en un Zip y ya esta. Incluso le puedo poner hasta contraseña al Zip para que nadie los pueda extraer. Luego a la hora de revertir el proceso leo el Zip, extraigo los archivo y los utilizo. No seria mala idea verdad?

Tortuguica 17-07-2011 11:01:04

Pues no parece mala, no, fide_uci. Lo que pasa es que, en principio, no quiero recurrir a otras aplicaciones... Pero lo estudiaré, desde luego. Gracias por la idea. Un saludo.

Tortuguica 17-07-2011 11:04:33

Uy, fide_uci, me parece que acabo de meter la pata :-O Me he dado cuenta que dices que ZipForge es un componente. Se me ha ido el santo al cielo y he relacionado ZipForge con una aplicación tipo WinZip. Es que sigo estando un poco verde de más, lo siento :-( Bueno, y este componente, ¿de dónde lo saco?

fide_uci 17-07-2011 11:11:39

Bueno, hasta donde se en internet hay una version gratis, que lo unico que hace es ponterte un molesto cartelito cuando esta iniciando Delphi pero bueno no te afecta en nada a tu aplicacion. Puedes hacer una busqueda en google "ZipForge + Delphi" o algo parecido y bajarte el componente. Saludos.

Casimiro Noteví 17-07-2011 14:53:28

Cita:

Empezado por Tortuguica (Mensaje 406642)
Uy, fide_uci, me parece que acabo de meter la pata :-O Me he dado cuenta que dices que ZipForge es un componente. Se me ha ido el santo al cielo y he relacionado ZipForge con una aplicación tipo WinZip. Es que sigo estando un poco verde de más, lo siento :-( Bueno, y este componente, ¿de dónde lo saco?

Hay algunos componentes de compresión que son libres y puedes usarlos, por ejemplo zipmaster.


La franja horaria es GMT +2. Ahora son las 01:50:39.

Powered by vBulletin® Version 3.6.8
Copyright ©2000 - 2026, Jelsoft Enterprises Ltd.
Traducción al castellano por el equipo de moderadores del Club Delphi