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

173

Simplemente algo con lo que me encontré 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 eso posible? Quiero decir, incluso si el archivo en sí 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)

Eugene S
fuente
81
el nombre del archivo no cuenta en el archivo, así como se puede explicar.
njzk2
123
Recuerdo a un amigo en la universidad que escribió un software para almacenar texto como nombres de archivo para evitar la cuota de disco.
slebetman
15
@ColeJohnson Fui pasante en la década de 2000 en uno de los laboratorios de computación de mi U, y la cuota de usuario se calculó como la suma de los tamaños de archivo. Por lo tanto, almacenar datos como nombres de archivo realmente se movería alrededor de qouta. Diablos, podría guardar un programa en carpetas y no contaría contra su cuota.
Mindwin
20
@slebetman Este es el punto donde la línea entre el genio y la locura se vuelve borrosa.
Pharap
10
Una técnica similar se usó famoso en un desafío de compresión ,
Oddthinking

Respuestas:

202

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 "adjunta" un archivo a un directorio y los nombres de archivo y los metadatos relacionados se almacenan en el directorio.

David Schwartz
fuente
30
... también conocido como enlaces duros.
Daniel B
66
En el directorio De lo contrario, si el mismo archivo estaba en dos directorios y usted lo renombró 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
14
En la mayoría de los sistemas operativos tipo UNIX, como FreeBSD y Linux, puede obtener fácilmente el tamaño de un directorio. Los comandos como ls -ld <directory>funcionarán.
David Schwartz
11
No sé si esto es cierto para la versión actual de NTFS, pero las primeras versiones (por ejemplo, en NT3.x) almacenarían los datos de archivos muy pequeños en la entrada del directorio. El archivo literalmente no existiría.
John Rennie
13
No es del todo cierto que no haya un archivo, a menos que NTFS sea muy diferente de otros sistemas de archivos. En un sistema de archivos normal de Unix, habría un inodo que almacena los permisos, los tiempos de modificación, etc. La entrada del directorio todavía se refiere a este inodo. La única diferencia entre un archivo vacío y un archivo 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 de permisos y tiempos de modificación, incluso para archivos vacíos. Por ejemplo, los inodes XFS son 256B
Peter Cordes
82

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

Hay muchos tamaños de archivo que son significativos. El más común, y el que está viendo aquí, es "el número 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 con anticipación.

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 incluso un múltiplo 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, al que está tirando, sería la cantidad real de bits necesarios 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 del "nombre de archivo" se almacena en el inodo del 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 de menos de 156 bytes se pueden almacenar directamente en el inodo). Este no es un significado comúnmente usado, porque es terriblemente difícil de determinar sin conocer el funcionamiento interno tremendamente profundo de su sistema de archivos (¿explicó el espacio necesario para almacenar todos los permisos en el archivo?). Sin embargo, si tiene un disco duro de 1,000,000 bytes,

Cort Ammon
fuente
2
"en el inodo para el directorio que contiene el archivo" ¿No te refieres a los datos del directorio, en lugar de su inodo? El inodo contiene tamaños y fechas de archivo, pero no nombres ...
Medinoc
@Medinoc Buen punto. Estaba pensando en el caso en línea cuando almacenaba los datos dentro del inodo, ¡pero en realidad no verifiqué cuánto podía ocurrir! He agregado una edición.
Cort Ammon
Función de datos en línea relacionada de ext4, esto no es universal en todos los sistemas de archivos. Además, esto se aplica al inodo de los archivos, no al directorio. Están separados, los directorios también tienen una capacidad de datos en línea, pero son características separadas. Un inodo de archivos tiene un tamaño establecido, 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.
Phises
8
Si tiene un disco duro de 1,000,000 bytes, puede ser hora de comenzar a pensar en una actualización.
nekomatic
53

El nombre del archivo se almacena en otro lugar.

Su disco tendrá un "sistema de archivos", simplemente un método para elegir cómo se representan e interpretan los nombres 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. Consulte el artículo de Wikipedia en la Tabla maestra de archivos .

Por lo tanto, el archivo en sí tendrá una longitud de 0 bytes, pero su entrada en la MFT todavía ocupará algo de espacio.

Mateo1471
fuente
11
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 de la secuencia 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 aún así tener el tamaño informado de 0 . Es una buena característica del sistema de archivos saber si quieres tener una imagen completa :)
Paweł Bulwan
12

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 tanto una parte del archivo como su propio nombre es físicamente una parte de usted (es decir, no lo es).

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

Luke
fuente
7

(Un poco tarde para la respuesta ...)

¿Cómo puede un archivo ser de tamaño cero? Es un poco más complicado que el proporcionado por las respuestas anteriores. La pregunta está etiquetada como Win7, pero mirar otros sistemas de archivos "más simples" como FAT 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 datos en pequeños bloques. El sistema operativo 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 (por ejemplo: 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" entiende el sistema operativo 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 los estantes como los bloques de datos (el catálogo de tarjetas también se encuentra en una estructura similar a un estante).

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

  • Nombre = My_File.txt
  • Longitud = 0
  • Bloque de datos de inicio = 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 el disco y el sistema operativo para leer. Si solo escribe "Hola", la mayor parte del bloque está "vacío" (en realidad puede no ser ceros, sino basura de lo que estaba allí antes), por lo que la tabla ahora también actualiza el tamaño a la longitud (digamos 5 caracteres + Fin de Archivo) para que no obtenga las cosas malas.

Cuando actualiza el "archivo" a una longitud> tamaño de bloque, el sistema operativo escribe los datos en el nuevo bloque y actualiza un bloque de datos para decir que el archivo continúa en el siguiente bloque DESPUÉS del primero (y así sucesivamente) y la longitud se actualiza. nueva longitud (los detalles difieren).

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 lleva 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. Eliminar un archivo: simplemente elimine la entrada en el bloque de directorio, liberando los bloques de datos del archivo para ser reasignados.

ps: el hecho de que el catálogo de tarjetas tenga una entrada para un libro no significa que esté en el estante (tal vez extraído o perdido); tamaño de archivo 0.

pps: Un libro fuera de lugar dentro de la biblioteca implica buscar en la biblioteca, o en términos de computadora: ¡chkdsk o reparar el disco!

Se puede obtener una mayor comprensión leyendo acerca de los inodos de UNIX o apreciando cómo los sistemas de control de versiones (ClearCase, TFS, Git, etc.) manejan no solo archivos y directorios, sino también versiones de archivos e incluso versiones de 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 archivos y estructura de directorios clásicos!

Ian W
fuente
4

Tenemos algunas respuestas excelentes aquí: solo agregaría la versión de la imagen (mil palabras y todo eso).

Así es como se ve uno de mis discos duros con formato NTFS si lo visualiza con una herramienta de desfragmentación de disco. La MFT (tabla maestra de archivos) se muestra en violeta:

ingrese la descripción de la imagen aquí

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

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

ingrese la descripción de la imagen aquí

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

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

OnoSendai
fuente
3

Los sistemas de archivos almacenan una gran cantidad de información sobre un archivo, como el nombre del archivo, el tamaño del archivo, el tiempo de creación, el tiempo de acceso, el tiempo modificado, el usuario creado, los permisos de usuarios y grupos, los fragmentos, el puntero a los clústeres que almacenan el archivo, los enlaces duros / blandos, los atributos ... Esos se llaman metadatos de archivo . ¿Por qué cuenta esos metadatos en el tamaño del archivo cuando los usuarios no (necesitan) preocuparse por ellos y no los conocen? Realmente solo les importa el contenido del archivo

Además, cada sistema de archivos almacena diferentes tipos de metadatos que ocupan diferentes cantidades de espacio en el disco. Por ejemplo, los permisos POSIX son muy diferentes de los permisos NTFS, y también hay inodenúmeros en POSIX que no existen en Windows. Incluso los sistemas de archivos POSIX varían mucho, como ext3 con 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 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 requiere 128 bytes de metadatos. Sin embargo, el contenido del archivo es exactamente el mismo , el número de bytes en los archivos también es el mismo. Por lo tanto, mostrar el tamaño del archivo como 156 bytes en un sistema pero 228 bytes en otro es muy confuso y contra intuitivo .

phuclv
fuente
1

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

Los metadatos del archivo (fecha y hora de creación, fecha y hora de la última modificación, propietario del archivo, permisos) se almacenan en cualquier otro lugar y no se incluyen como parte del tamaño del archivo.

nopole
fuente
0

Comprenda de manera simple ... cuando crea un archivo ... se genera una entrada de directorio que funciona como un puntero para la ubicación de la memoria del archivo identificado por el nombre de archivo que proporciona. El tamaño del directorio aumenta a medida que crea más y más punteros o dice archivos ... mientras que el tamaño del archivo aumentará solo si coloca algunos datos en el lugar señalado, es decir, dentro del propio archivo. Hasta entonces el tamaño será cero. :)

Vikash Mishra
fuente
Esto es realmente un comentario, no una respuesta, y simplemente repite lo que otros han dicho.
JakeGould
0

Así es como funciona:

Tan pronto como crea un archivo en un volumen, crea un registro de archivo en el archivo NTFS mata, es decir, $ MFT (tabla de archivos maestros). Como hay un FRS (segmento de registro de archivo) presente en la MFT, verá un registro. Cada registro de archivo tiene un tamaño de 1 KB por defecto en el caso de NTFS FileSystem. Pero ese espacio solo se reclama si almacena alguna información dentro del archivo. Aunque solo escriba una letra "a" considerando que es un archivo de texto, reclamará 1 KB de espacio porque ese es el tamaño predeterminado del FRS. La letra "a" va al flujo de datos predeterminado y sin nombre de ese FRS, $ Data, que es un atributo donde va todo su dato si no tiene un ADS (flujo de datos alternativo).

Avísame si tienes alguna pregunta.

Sdf
fuente