Respuesta simple: porque se define de esa manera.
Respuesta más larga: se define de esa manera porque algunas operaciones son conceptualmente más simples:
- Si un archivo contiene 20 letras "A" y elimina todas las "A", el archivo se acortará 20 bytes. La misma operación en un archivo que consistía solo en "AAAAAAAAAAAAAAAAAAAA" tendría que tratar con el caso especial de un archivo desaparecido.
- Más prácticamente, la eliminación de la última línea de un archivo de texto debería estar en mayúsculas especiales.
- Los editores de texto que regularmente hacen una copia de seguridad necesitarían un código de caso especial para lidiar con la situación de que el usuario podría eliminar la última línea, ir a almorzar, luego regresar y agregar otra línea. Surgen complicaciones adicionales si otros usuarios crean un archivo con ese nombre mientras tanto.
Puede hacer más cosas: * Los archivos de registro de errores tienden a crearse vacíos, para llenarse solo si ocurre un error. * Para saber cuántos errores ocurrieron, cuente el número de líneas en los archivos de registro. Si el archivo de registro está vacío, el número de errores es cero, lo que tiene mucho sentido. * A veces ve archivos donde todo el texto relevante está en el nombre del archivo, por ejemplo this-is-the-logging-directory
. Esto evita que los administradores ansiosos eliminen directorios vacíos después de la instalación, y también evita errores en los que un programa o un usuario crean accidentalmente un archivo donde el programa desea ver un directorio más tarde. El git
programa (y otros) tienden a ignorar los directorios vacíos, y si un proyecto / administrador / usuario quiere tener un registro de que el directorio existe aunque no tenga contenido útil (todavía), puede ver un archivo vacío llamadoempty
o empty.directory
.
Ninguna operación se vuelve más complicada:
- Concatenación de archivos: esto es solo un no-op con un archivo vacío.
- Búsqueda de una cadena en un archivo: esto está cubierto por el caso estándar de "si el archivo es más corto que el término de búsqueda, no puede contener el término de búsqueda".
- Lectura del archivo: los programas deben lidiar con presionar el final del archivo antes de obtener lo que esperaban, por lo que nuevamente el caso de un archivo de longitud cero no implica pensar más para el programador: simplemente presionará el final de -archivo desde el principio.
En el caso de los archivos, el aspecto "hay un archivo grabado en alguna parte" (inodo y / o nombre del archivo) se suma a las consideraciones anteriores, pero los sistemas de archivos no harían eso si los archivos vacíos fueran inútiles.
En general, todas las razones anteriores, excepto las relacionadas con los nombres de archivo, se aplican a las secuencias. Lo más notable para las cadenas, que son secuencias de caracteres: las cadenas de longitud cero son comunes dentro de los programas. Las cadenas generalmente no se permiten a nivel de usuario si no tienen sentido: un nombre de archivo es una cadena, y la mayoría de los sistemas de archivos no permiten una cadena vacía como nombre de archivo; internamente, al crear nombres de archivo a partir de fragmentos, el programa puede tener una cadena vacía como uno de los fragmentos.