C: teoría sobre cómo extraer archivos de un archivo archivado

En CI, hemos creado un progtwig que puede archivar múltiples archivos en un archivo a través de la línea de comandos. p.ej

$echo 'file1/2' > file1/2.txt $./archive file1.txt file2.txt arhivedfile $cat archivedfile file1 file2 

¿Cómo creo un proceso para que en mi archivo archivado tenga:

 header file1 end header file2 end 

Todos se almacenan en el archivo comprimido uno tras otro. Sé que tal vez se necesite un archivo de encabezado (que contenga el nombre de archivo, el tamaño del nombre de archivo, el inicio y el final del archivo) para extraer estos archivos de nuevo en su forma original, pero ¿cómo puedo hacer esto?

Estoy atascado en dónde y cómo empezar.

Por favor, alguien podría ayudarme con alguna lógica sobre cómo acercarme a extraer archivos de un archivo archivado.

Como se ha mencionado anteriormente, comience con el algoritmo. Ya tienes la mayoría de los detalles.

Hay algunos enfoques que puede tomar:

  1. Archivo de acceso aleatorio.
  2. Archivo de acceso secuencial.

Archivo de acceso aleatorio

Para que esto funcione, el encabezado debe actuar como un índice (como los índices de tarjeta en una biblioteca), lo que indica; (a) dónde encontrar el inicio de cada archivo; y (b) la longitud de cada archivo. El algoritmo para escribir el archivo comprimido podría verse así:

  1. Obtener una lista de todos los archivos de la línea de comandos.
  2. Cree una estructura para contener los metadatos de cada archivo: nombre (255 caracteres), tamaño (64 bits int), fecha y hora, y permisos.
  3. Para cada archivo, obtener sus estadísticas.
  4. Almacena las estadísticas de cada archivo dentro de una matriz de estructuras.
  5. Abra el archivo para escribir.
  6. Escribe la estructura del encabezado.
  7. Para cada archivo, agregue su contenido al archivo comprimido.
  8. Cierre el archivo comprimido.

(Es posible que el encabezado también tenga que incluir el número de archivos).

A continuación, el algoritmo para extraer archivos:

  1. Obtener un archivo de la línea de comandos.
  2. Obtenga un nombre de archivo para extraer, también desde la línea de comandos.
  3. Crear memoria para una estructura para leer metadatos sobre cada archivo.
  4. Lea todos los metadatos del archivo comprimido.
  5. Busque el nombre del archivo para extraer en la lista de metadatos.
  6. Calcule el desplazamiento en el archivo de almacenamiento para el inicio del nombre del archivo coincidente.
  7. Busca el desplazamiento.
  8. Lea el contenido del archivo y escríbalo en un archivo nuevo.
  9. Cierra el nuevo archivo.
  10. Cierra el archivo.

Acceso secuencial

Esto es mas facil Puedes hacerlo tú mismo: piensa en los pasos.

Acerca de la progtwigción

Es fácil quedar atrapado en los detalles de cómo debería funcionar algo. Le sugiero que dé un paso atrás, algo que su maestro debería discutir en clase, y trate de pensar en el problema en un nivel superior a la encoding, porque:

  • el algoritmo que crees será independiente del lenguaje;
  • corregir errores en un algoritmo, antes de escribir el código, es trivial;
  • Tendrá una mejor comprensión de lo que necesita hacer antes de codificar;
  • tomará menos tiempo implementar la solución;
  • puede identificar áreas que pueden implementarse en paralelo;
  • Verá posibles obstáculos antes de tiempo; y
  • Usted estará en su camino a los puestos directivos en ningún momento. 😉

Creo que el encabezado necesitaría tener la información necesaria para identificar el archivo y su tamaño dentro del archivo, por ejemplo, el nombre del archivo, el directorio original y el tamaño en líneas o bytes, dependiendo de cuál sea más útil en su archivo. contexto. Luego necesitaría rutinas para crear un encabezado, agregar un archivo a un archivo (crear un encabezado y adjuntar los datos del archivo), extraer un archivo de un archivo (seguir los encabezados hasta encontrar la entrada correcta y copiar los datos del archivo). archivar en un archivo separado) y eliminar un archivo (comience a leer el archivo, copiando los datos de todas las entradas excepto la que desea eliminar en un archivo nuevo, luego elimine el archivo antiguo y cambie el nombre del nuevo al nombre antiguo).

Comparte y Disfruta.

Un enfoque es imitar el formato ZIP: http://en.wikipedia.org/wiki/ZIP_file_format

Utiliza una estructura de directorios al final del archivo, que contiene punteros a las compensaciones de los archivos en el archivo. La gran ventaja de esta estructura es que puede encontrar un archivo determinado sin tener que leer todo el archivo, siempre y cuando sepa el inicio del directorio y tenga la capacidad de acceder al archivo al azar.

Una alternativa es el formato de archivo TAR: http://en.wikipedia.org/wiki/Tar_file_format

Está diseñado para transmitir medios (“archivo de cinta”), por lo que cada entrada contiene sus propios metadatos. Tiene que escanear todo el archivo para una entrada, pero el caso de uso normal es empaquetar / descomprimir árboles de directorios completos, por lo que no es una pena tan grave.

Hacerlo de forma continua, como tar, es probablemente la implementación más fácil. Primero, escriba un número mágico para que pueda identificar que este es su formato de archivo. Entonces sugeriría usar stat (2) (esa es la syntax del manual de la página de estadísticas, sección 2) para obtener el tamaño del archivo a archivar. En realidad, mire de cerca los campos de estadísticas disponibles para usted, podría haber alguna información interesante que querría mantener.

Escriba la información que necesita en una forma de etiqueta = valor, una por línea. Por ejemplo:

 FileName=file1.txt FileSize=10 FileDir=./blah/blah FilePerms=0700 

Termine su encabezado con dos líneas nuevas para saber cuándo comenzar a empujar los bytes de FileSize al disco. No necesita un principio de marcador de encabezado, ya que sabe el tamaño del archivo para escribir, por lo que sabe cuándo comenzar a analizar su encabezado de nuevo.

Le sugiero que use un formato de texto para la información de su encabezado, porque entonces no tiene que preocuparse por el orden de bytes, etc., de lo que debería preocuparse si escribe una estructura binaria en bruto en el disco.

Al leer su archivo, analice las líneas del encabezado una por una y rellene una estructura local para almacenar esa información. Luego, escriba el archivo en el disco y establezca las propiedades de los archivos que deban actualizarse en función de la información del encabezado que extrajo.

Espero que ayude. Buena suerte.