Pregunta ¿Cómo puede un tamaño de archivo ser cero?


Solo algo con lo que me topé y no pude pensar en una explicación adecuada. Si creo un archivo * .txt vacío en mi PC y luego miro su tamaño, muestra 0. Pero, ¿cómo es posible? Quiero decir, incluso si el archivo está vacío, aún debe tener algún tamaño, solo para almacenar su propio nombre. ¿Cómo se puede explicar esto? (No específico del sistema operativo)


173


origen


el nombre del archivo no cuenta en el archivo, cómo se puede explicar. - njzk2
Me recuerda a un amigo de la universidad que escribió una pieza de software para almacenar texto como nombres de archivo para evitar la cuota de disco. - slebetman
@ColeJohnson. Fui interno en la década de 2000 en uno de los laboratorios de informática de mi U. La cuota de usuario se calculó como la suma de tamaños de archivo. Así que almacenar datos como nombres de archivo realmente se movería alrededor de qouta. Diablos, podrías guardar un programa en carpetas y no contaría en contra de tu cuota. - Mindwin
@slebetman Este es el punto donde la línea entre el genio y la locura se vuelve borrosa. - Pharap
Una técnica similar fue utilizada famosamente en una desafío de compresión, - Oddthinking


Respuestas:


Es posible porque realmente no hay archivo. Solo hay una entrada de directorio con un nombre y un propietario. La entrada del directorio es lógicamente distinta del archivo. Por ejemplo, el mismo archivo puede tener más de un nombre en más de un directorio.

Desafortunadamente, el término "archivo" no siempre se usa para significar exactamente lo mismo. Pero la lógica del tamaño del archivo proviene del modelo donde una entrada de directorio "conecta" un archivo a un directorio y los nombres de los archivos y los metadatos relacionados se almacenan en el directorio.


201



... también conocido como Hard Links. - Daniel B
En el directorio De lo contrario, si el mismo archivo estuviera en dos directorios y lo renombrara en uno, eso modificaría el otro directorio, lo que no tendría ningún sentido. Además, si no fuera así, ¿cuál sería el contenido de un directorio? - David Schwartz
En la mayoría de los sistemas operativos tipo UNIX, como FreeBSD y Linux, puede obtener fácilmente el tamaño de un directorio. Comandos como ls -ld <directory> trabajará. - David Schwartz
No sé si esto es cierto para la versión actual de NTFS, pero las versiones anteriores (por ejemplo, NT3.x) almacenarían los datos de los archivos muy pequeños en la entrada del directorio. El archivo literalmente no existiría. - John Rennie
No es del todo cierto que no haya archivos, a menos que NTFS sea muy diferente de otros sistemas de archivos. En un sistema de archivos Unix normal, habría un inodo que almacena los permisos, tiempos mod, etc. La entrada del directorio todavía se refiere a este inodo. La única diferencia entre un archivo vacío y uno no vacío es el puntero para asignar bloques. Sin embargo, un archivo vacío tiene el equivalente del sistema de archivos de un puntero NULL para su mapa de bloques, para indicar que no tiene ningún bloque de datos. Las entradas de directorio no están abarrotadas con permisos y tiempos mod, incluso para archivos vacíos. por ejemplo, los inodos XFS son 256B - Peter Cordes


El significado semántico de "tamaño de archivo" es diferente del que está usando.

Hay muchos tamaños de archivo que son significativos. El más común, y el que está viendo aquí, es "la cantidad de bytes en el archivo". Si el archivo es un archivo de texto vacío, puede contener 0 bytes. Este número es importante para los programadores porque a menudo necesitamos abrir un archivo, "leer todos los datos" y cerrarlo. Necesitamos saber cuántos bytes de datos habrá en el archivo para poder planificar el futuro.

Otro significado surge de la forma en que la mayoría de los sistemas de archivos almacenan datos. La mayoría de los sistemas de archivos almacenan datos en bloques. Por ejemplo, el sistema de archivos puede almacenar datos en bloques de 64kB, lo que significa que nunca asignará nada que no sea un múltiplo par de 64kB. Esto suena ineficiente, pero puede hacer que la contabilidad sea mucho más simple y, a menudo, más simple significa más rápido.

Un tercer significado, que está tirando, sería la cantidad real de bits requeridos en el disco duro para describir la presencia de un archivo. Esto incluye información que generalmente se almacena por separado del archivo. Por ejemplo, en Linux, el concepto de "nombre de archivo" se almacena en el nodo para el directorio que contiene el archivo (editar: de los comentarios, técnicamente esto se almacena en los datos del directorio. Cuando escribí esto, estaba pensando en el pequeño -directory case. Los datos menores de 156 bytes se pueden almacenar directamente en el inodo). Este no es un significado comúnmente utilizado, porque es terriblemente difícil de determinar sin conocer el funcionamiento interno tremendamente profundo de su sistema de archivos (¿dio cuenta del espacio necesario para almacenar todos los permisos en el archivo?). Sin embargo, si tiene un disco duro de 1.000.000 de bytes y desea saber qué tamaño de archivo cabe en ese disco duro, este será un significado muy importante para usted.


82



"en el inode para el directorio que contiene el archivo" ¿No te refieres a los datos del directorio, en lugar de a su inodo? El inodo contiene tamaños de archivo y fechas, pero no hay nombres ... - Medinoc
@Medinoc Buen punto. Estaba pensando en el caso en línea cuando almacenó los datos dentro del inodo, ¡pero en realidad no verifiqué cuánto podría ocurrir! He agregado una edición. - Cort Ammon
Relacionado función de datos en línea de ext4, esto de ninguna manera es universal en todos los sistemas de archivos. Además, esto se aplica a los archivos inode, no al directorio. Están separados, los directorios también tienen una capacidad de datos en línea, pero son características separadas. Un inode de archivos tiene un tamaño de conjunto, al menos en el caso de ext4, por lo que el uso de datos de los permisos es irrelevante. El uso de un disco de archivos depende en gran medida del sistema de archivos en uso, la tercera parte de esta respuesta solo se aplica a ext4 por lo que puedo decir, esto no está claro. - Phizes
Si tiene un disco duro de 1,000,000 de bytes, podría ser el momento de comenzar a pensar en una actualización. - nekomatic


El nombre del archivo está almacenado en otro lugar.

Su disco tendrá un "sistema de archivos" en él, simplemente ponga un método para elegir cómo se representan e interpretan los nombres de archivo y los archivos en el disco físico.

En la mayoría de los discos de Windows, utilizará un sistema de archivos llamado "NTFS" (Sistema de archivos de nueva tecnología), que almacena la información del nombre de archivo en la tabla maestra de archivos (MFT) separada del contenido del archivo. Artículo de Wikipedia sobre Master File Table.

Por lo tanto, el archivo en sí tendrá una longitud de 0 bytes, pero su entrada en el MFT seguirá ocupando espacio.


53



y en el caso de NTFS, el tamaño del archivo informado por Windows y la mayoría de las herramientas es en realidad el tamaño del archivo. corriente principal del archivo, que percibimos como el contenido del archivo. El archivo almacenado en la partición NTFS también puede tener algunos datos almacenados en flujos de datos alternativos, y todavía tienen el tamaño informado de 0. Es una buena característica del sistema de archivos para saber si quieres tener la imagen completa :) - Paweł Bulwan


Esta es una pregunta ontológica bastante interesante ...

El archivo en sí es el contenido del archivo. Si el archivo no tiene contenido, tiene un tamaño de cero. El nombre del archivo es una parte tan importante del archivo, ya que su nombre es físicamente parte de usted (es decir, no lo es).

Así como su nombre existe como una idea en las cabezas de las personas (y la suya) que se refiere / apunta al físico, el nombre del archivo existe en el árbol de directorios del sistema de archivos y se refiere / apunta al archivo.


12





(Un poco tarde para la respuesta ...)

Cómo puede un archivo ser tamaño cero es un poco más complicado que el proporcionado por las respuestas anteriores. La pregunta está etiquetada como Win7, pero mirando a otros sistemas de archivos "más simples" como GRASA o NTFS, puede ser útil ya que los conceptos son similares.

El disco no "sabe" qué es un archivo y qué es un directorio; son todos los datos en pequeños bloques. El SO distingue entre el significado de los bloques de datos. Los primeros son especiales, pero el resto de los bloques contienen información sobre los datos (p. Ej., Nombre del archivo, longitud del archivo, primer bloque de datos que contiene los datos) o los datos en sí.

Un directorio es un "archivo" especial cuyos "datos" el OS entiende que es un bloque de información que contiene información sobre archivos, no el contenido de los archivos. Una buena analogía es una biblioteca física y el catálogo de tarjetas. Piense en los bloques de información como el catálogo de tarjetas y las estanterías como los bloques de datos (el catálogo de tarjetas también se encuentra en una estructura similar a una estantería).

Cuando "crea" un archivo (digamos con UNIX touch comando), el sistema operativo primero crea una entrada en un bloque de información (directorio), con lo siguiente:

  • Nombre = Mi_archivo.txt
  • Longitud = 0
  • Inicio del bloque de datos = N / A
  • Información adicional (propietario, permisos, fecha de creación / actualización / modificación), etc.

Solo si hay algunos datos para "escribir" intenta encontrar un bloque de datos vacío para almacenar los datos. Pero los bloques de datos vienen en tamaños fijos (digamos 32K) convenientes para que el disco pueda acceder y el SO para leer. Si solo escribe "Hola", la mayor parte del bloque está "vacía" (en realidad puede no ser ceros, sino basura de lo que había antes), por lo que ahora la tabla también actualiza el tamaño a la longitud (digamos 5 caracteres + Fin de Archivo) por lo que no obtiene las cosas malas.

Cuando actualiza el "archivo" a un tamaño de bloque de longitud, el SO escribe los datos en el nuevo bloque y actualiza un bloque de datos para indicar que el archivo continúa en el siguiente bloque DESPUÉS de la primera (y así sucesivamente) y la longitud se actualiza. nueva longitud (detalles difieren).

Con lo que termina es una colección de bloques de datos de información (directorios o listas) con información sobre las cadenas de bloques de datos (contenido del archivo).

Lógicamente, esto también explica por qué un movimiento de archivo en el mismo sistema de archivos parpadea rápidamente mientras que una copia tarda mucho tiempo. El sistema operativo solo tiene que editar 2 bloques de directorio para eliminar la entrada de un directorio (bloque de datos de información) y agregar a otro. Elimine un archivo: simplemente elimine la entrada en el bloque del directorio, liberando los bloques de datos del archivo que se reasignarán.

PD: Solo porque el catálogo de tarjetas tenga entrada para un libro no significa que esté en la estantería (desprotegido o perdido tal vez); tamaño de archivo 0.

pps: un libro extraviado dentro de la biblioteca implica una biblioteca de búsqueda, o en términos de computadora: ¡chkdsk o disco de reparación!

Se puede obtener una mayor comprensión leyendo los inodos de UNIX o apreciando cómo los sistemas de control de versiones (ClearCase, TFS, Git, etc.) administran no solo los archivos y directorios, sino también las versiones de los archivos e incluso las versiones de los directorios. En la mayoría de los casos, todo se almacena en una base de datos y se presenta al usuario para que aparezca como estructura de directorios y archivos clásicos.


7





Aquí tenemos algunas respuestas excelentes: solo tengo que agregar la versión de la imagen (mil palabras y todo eso).

Esto es lo que parece una de mis unidades de disco duro con formato NTFS si la visualiza con una herramienta de desfragmentación de disco. los MFT (Master File Table) se muestra en violeta:

enter image description here

Ese pequeño cuadro violeta describe la lista de archivos presentes en mi HD. En términos generales, es, para un disco NTFS, lo que el índice es para un libro; en lugar de páginas, apunta a su ubicación física en el resto del disco1.

Un archivo con un tamaño de cero bytes se puede visualizar como una entrada de tabla de contenido que apunta a ninguna página en absoluto:

enter image description here

La entrada está allí, en la lista, pero como no se indica ninguna página, podemos suponer que el contenido no existe.

1 - Sin duda, es un poco más complicado que eso; pero puntos como los mapas sectoriales, las MFT espejo, etc. están fuera del alcance de estas preguntas.


4





Tienda de sistemas de archivos mucho de información sobre un archivo como nombre de archivo, tamaño de archivo, tiempo de creación, tiempo de acceso, tiempo modificado, usuario creado, permisos de usuario y grupo, fragmentos, puntero a clusters que almacenan el archivo, enlaces de hardware / software, atributos ... Esos son llamados metadatos del archivo. ¿Por qué se cuentan esos metadatos en el tamaño del archivo cuando los usuarios no se (necesitan) preocuparse por ellos y no los conocen? Solo les importa el contenido del archivo

Además cada sistema de archivos almacena diferentes tipos de metadatos que toman diferentes cantidades de espacio en el disco. Por ejemplo, los permisos POSIX son muy diferentes de los permisos NTFS, y también hay inode números en POSIX que no existen en Windows. Incluso los sistemas de archivos POSIX varían mucho, como ext3 con la dirección de bloque de 32 bits, ext4 con 48 bits, Btrfs con 64 bits y ZFS con dirección de 128 bits. Entonces, ¿cómo va a contar esos metadatos en el tamaño del archivo?

Tome otro ejemplo con un archivo de 100 bytes cuyos metadatos consumen 56 bytes en el sistema de archivos actual. Copiamos el archivo a otro sistema de archivos y ahora se necesitan 128 bytes de metadatos. Sin embargo, el el contenido del archivo es exactamente el mismo, la cantidad de bytes en los archivos son lo mismo Entonces, mostrar el tamaño del archivo como 156 bytes en un sistema pero 228 bytes en otro es muy confuso y contra-intuitivo.


3





Un tamaño de archivo de 0, es similar a decir: Tengo un papel con 5 palabras sobre eso Y en otro papel, tiene 0 palabras sobre eso Asi que 0 es completamente posible.

Los metadatos del archivo (hora de la fecha de creación, hora de la última fecha de modificación, propietario del archivo, permisos) están todos almacenados donde no están incluidos como parte del tamaño del archivo.


1